[Vienna-pm] export enviroment vars

josef schmid e9427749 at stud4.tuwien.ac.at
Thu Sep 3 08:56:05 PDT 2009


josef schmid schrieb:
> 
> Hallo, allerseits!
> 
> 
> Mir ist da (zumindest für mich) seltsames aufgefallen.
> 
> perl -e '$ENV{foo}=q{bla}; exec q{echo $foo >&2};'¹⁺²
> bla # was ich erwarte
> 
> perl -e 'local %ENV;$ENV{foo}=q{bla}; exec q{echo $foo >&2};'
> bla # was ich auch erwarte
> 
> perl -e 'local *ENV;$ENV{foo}=q{bla}; exec q{echo $foo >&2};'
> # 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.

Irgendwann zu 5.6.x Zeiten hatte ich den umgekehrten Fall das 
Lokalisieren mittels glob verhindert das eine Spezialvariable ihre 
Besonderheit verliert.

Regeln ala "Vermeide dies" kann ich gut leben, aber Regeln ala
"Wenn es so nicht geht, dann versuche es andersrum" sind eher
unangenehm.

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'; … }

Irgendwie habe ich es geschafft, all die Jahre nicht darüber
zu stolpern. ;-] (Oder es hat sich doch mal umgedreht?)

(Damit geht  local %ENV; *ENV=…   eben nicht.
  Und local %ENV; *ENV{HASH}=… ist nicht erlaubt.

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

  Oder denke ich bloß zu kompliziert?
)



Nun zu etwas komplett anderem.
Etwas für die Ästhetizisten unter euch.
Was ist am wenigsten hässlich:

a) local %ENV=%$newenv if $newenv; readonly_something…
    Kurz & tut was es soll. Aber seltsam & gewöhnungsbedürftig.

b) local %ENV=$newenv ? %$newenv : %ENV; readonly_something…
    Etwas verwirrend und macht ¿wahrscheinlich? eine unnötige
    Kopie falls $newenv nicht vorhanden.

b2) local %ENV=%{ $newenv ? $newenv : \%ENV }; readonly_something…

c) my $inner=sub { readonly_something… };
    if ($newenv) { local %ENV=%$newenv; &$inner } else { &$inner }
    Halt relativ explizit

d) POSIX::exec…e(…);
    Nur in sehr speziellen Fällen,
    und erwartet die Parameter wahrscheinlich ohnehin unperlisch.

e) Oder??




pfiateng,
   Josef


PS: Zum Ausgleich lässt sich^W^Wist das Env Modul nicht verwirrend:
     use Env "bla"; { local %ENV=(bla=>2); print "$bla\n" }



More information about the Vienna-pm mailing list