Jak alokovat pole; jak vytvorik referenci na kopii pole

Honza Pazdziora adelton na informatics.muni.cz
Úterý Červenec 30 10:48:18 MEST 2002


On Tue, Jul 30, 2002 at 09:55:59AM +0200, Martin Sittek wrote:

> Jestli tomu dobře rozumím, tak tenhle příkaz 
> 
> $pole[$pocet_polozek - 1] = 'konkretni_ne_undef_hodnota';
> 
> vytvoří pole, v němž bude @pole[0..$pocet_polozek-2] == undef a 
> v $pole[$pocet_polozek-1] == 'konkretni_ne_undef_hodnota'. 

Ano.

> > 	@pole = ( 'hodnota' ) x $pocet_polozek;
> 
> A tady bude vždy ve všech polích 'hodnota', což je ještě lepší.

Je otázka, čeho chcete dosáhnout, ale ano: v jistých případech to je
lepší.

> 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 vytvořit referenci na kopii nějakého konkrátního pole. Zatím
> > 
> > 	$ref = [ @pole ];
> 
> Toto je přesně co jsem hledal.

Super.

> > Nebo to zadání bylo "jak vytvořit pole obsahující ve svých prvcích
> > reference na odpovídající prvky původního pole"? Nebo to zadání bylo
> 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é.

-- 
------------------------------------------------------------------------
 Honza Pazdziora | adelton na fi.muni.cz | http://www.fi.muni.cz/~adelton/
      ... all of these signs saying sorry but we're closed ...
------------------------------------------------------------------------


Další informace o konferenci Perl