[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