[Vienna-pm] export enviroment vars

Josef e9427749 at stud4.tuwien.ac.at
Tue Sep 8 09:13:36 PDT 2009


Nochmals hi!

ich schrieb:
>> Mir ist da (zumindest für mich) seltsames aufgefallen.
>>
>> $ENV{foo}='bla'; exec q{echo $foo};
>> bla # was ich erwarte
>> local %ENV;$ENV{foo}='bla'; exec q{echo $foo};
>> bla # was ich auch erwarte
>> local *ENV;$ENV{foo}='bla'; exec q{echo $foo};
>> # bäng, nix.
> 
> Das gilt natürlich auch für:
> local %ENV=(foo => 'bla'); [OK]
> local *ENV={foo => 'bla'}; [zumindest vorerst irritativ]
> Nun ja offensichtlich verliert %ENV sein magisches Verhalten, wenn
> über glob lokalisiert wird.
 > […]

> Aber gottseidank^W*glücklicherweise* scheint Perl trotzdem
> hier einer Regel zu folgen. Wenn mittels glob,
> dann wird der Sonderstatus von der rechten Seite übernommen.
> D.h.: { local *e=\%ENV; $e{foo}='bla'; system 'echo $foo' }; …
>       tut, und eben auch
>       { local %ENV; $ENV{foo}='bla'; … }
 > […]

Aber das erlaubt so seltsame Dinge wie:
(*SIG, *ENV)=(\%ENV,\%SIG); $SIG{foo}='bla'; exec 'echo $foo';

Perl-Obsfuscation lebe 3x hoch.

DWIMerisch ist das ihmo ¬ gerade.
Speziell bei den Spezialvariablen erwartet man wahrscheinlich
doch das die Magie am Namen haftet(/oder nachläuft). Sonst wohl eher ¬?


Um die Sache dann doch wieder verwirrend zu machen, für andere
spezielle (aber nicht zauberhaften?) Perl-Variablen, gehen wieder
beide Varianten:
z.B.: local *_=\$x und local $_=$x;

Hingegen:
local *STDERR{IO}=...; geht (wiederum) nicht. (v5.10)
Hier muss es
local *STDERR=\...; sein

Meinungen…
… oder gar einfache Regeln dafür‽

> […] 
>  Gibt es eine Möglichkeit den Status von links und die Referenz
>  von rechts zu bekommen, also statt den Daten den Status zu kopieren?

Zumindest Variable::Magic erlaubt nur eigene Zaubereien hinzuzufügen.

pfiateng,
   Josef



More information about the Vienna-pm mailing list