refs vs. my

Honza Pazdziora adelton na informatics.muni.cz
Pondělí Říjen 7 19:51:06 MEST 2002


On Mon, Oct 07, 2002 at 07:39:42PM +0200, Jiri Polcar wrote:
> 
> narazil jsem na problem pri pouziti nazvu promenne v oznaceni jine
> promenne. A to v pripade, ze jsem mel promennou, jejiz nazev jsem
> vytvarel deklarovanou pomoci 'my'. Lepsi bude priklad:
> 
> 1)  $name     = 'scalar';
>     ${$name}  = 'hodnota scalaru';
> 
>     print "scalar: $scalar";
> 
> 
> 2)  my $scalar;
> 
>     $name     = 'scalar';
>     ${$name}  = 'hodnota scalaru';
> 
>     print "scalar: $scalar";
> 
> Prikla (1) funguje tak, jak by clovek cekal, tedy v promenne $scalar
> bude 'hodnota scalaru'. Pri pouziti (2) dostanu hlasku:
> 
>     Use of uninitialized value in concatenation (.) or string at...
> 
> Na promennou deklarovanou monoci `my' se nemohu takto odkazat? Proc?

Protoze ona takto neexistuje. Neexistuje v tabulce symbolu, muzete si
to predstavit tak, ze existuje na zasobniku. Kdyz delate to ${$name},
tak rikate "v runtime najdi promennou podle jmena, ktere je v teto
promenne". Jenze ona je podle toho jmena nenalezetelna, protoze to
jmeno neexistuje. Neni to globalni promenna.

Co samozrejme udelat muzete je

	eval "\$$name = 'hodnota scalaru'";

kterym provedete vyhodnoceni uvedeneho Perloveho vyrazu. Ovsem
v tomhle prikladu dojde ke kompilaci toho prirazeni a soucasti te
kompilace je i vyhodnoceni toho jmena promenne. Zatimco ${$name} je
vyhodnoceni jmena promenne za behu, a to pracuje s globalnimi
promennymi (tedy temi, co jsou v tabulkach symbolu jednotlivych
packagu).

-- 
------------------------------------------------------------------------
 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