Jak alokovat pole; jak vytvorik referenci na kopii pole

Martin Sittek martin.sittek na infoprojekt.cz
Úterý Červenec 30 12:03:01 MEST 2002


On 30.07.02, Honza Pazdziora wrote:
> > Nicméně jak si tak s tím tady hraju, tak už si nejsem tak úplně jistý 
> > jestli má cenu to pole vůbec 'alokovat'. Měl jsem totiž pocit, že
> > když jej budu 'alokovat' (byť na hodnotu undef) tak se při použití
> > $x = $pole[$hodnota_v_mezich_pole] vyhnu takové té hlášce: 
> > use uninicialized value, nicméně jak to tak zkouším - asi to není 
> > pravda. Myslíte si, že má smysl provádět tuto 'alokaci'?
> 
> 	$ perl -w
> 	use strict;
> 	my @a;
> 	my $x = $a[5];
> 	__END__
> 	$ 
> 
> Nemá, protože problém je evidentně někde jinde -- samotné přiřazení
> nedefinované hodnoty hlášení Use of uninitialized value nedává. Dá je
> třeba až použití té nedefinované hodnoty při interpolaci ve stringu,
> nebo tak. A pak je otázka, jestli chcete mít zaplácanou paměť tím
> polem (jak to má být vlastně velké, 10 prvků nebo 10_000_000 prvků?)
> nebo jestli si vykódujete ošetření undef hodnot v tom kódu, kde se
> používají, nebo že na vhodná místa dáte local $^W = 0;

Jak to bude velké záleží na situaci, má to být jakási cache (pole
obsahující reference na pole /množné číslo :-)/, což budou jednotlivé
řádky tabulky. Předpokládám spíše velikost od X do XXX, víc asi ne.

>[...]

> > 2.
> > > "jak vytvořit pole obsahující ve svých prvcích reference na kopie
> > > prvků původního pole"?
> > > 
> > 
> > Myslel jsem tu druhou variantu, resp. "jak vytvořit pole obsahující 
> > ve svých prvcích reference na kopie celého původního pole".
> 
> No, čili pak už nám zbývá pouze si ujasnit, jestli prvky toho nového
> pole mají být opravdu reference na skaláry, a to na skaláry, které
> jsou kopiemi těch původních prvků, nebo jestli prvky toho nového pole
> mají být přímo kopie těch původních prvků, což dělá právě to
> 
> Jinak samozřejmě
> 
> 	@new = @pole;
> 
> zkopíruje prvky pole bez problémů také.

Ne na skaláry ale na pole (viz. výše uvedený příklad). Výsledek
by měl odpovídat:

@pole = ([1,2,3], [2,3,4], ...);



No takže ve výsledku to budu asi řešit tak, že se na 'alokaci' vykašlu
a pro ten druhý případ budy používat [@pole].

--
Martin Sittek


Další informace o konferenci Perl