Murphy: $_[0] problem

Beitrag lesen

[...]
Nun zur Frage des OP, warum geht folgendes nicht:
   sub myfunc{
     my $temp = shift; # das ist kurz für: shift @_
   }
shift @array entfernt das erste Element und kopiert den Wert in die neue Variable. That's it. Jeder Bezug geht verloren, sofern der Wert nicht eine Referenz war.
[...]

Nur der Vollständigkeit halber sollte man sagen, dass mit etwas Magie auch das Verhalten, welches sich der OP gewünscht hatte, erreicht werden kann: Statt

my $temp = $_[0];

oder ähnlichem schreibe man einfach

local *temp = \$_[0];

Dieser Code weist dem Skalarteil des Typeglobs *temp einen Alias auf das erste Arrayelement von @_ zu. Danach wirkt sich jede Modifikation an $temp auch auf den ursprünglichen Parameter aus.

Natürlich ist dann $temp keine lexikalische Variable mehr. Wenn man das haben möchte, kann man theoretisch zu use PAD::Walker greifen, was dann aber wohl schon unter schwarze Magie fällt ;-)

Generell würde ich von derartigem Code abraten. Die Lesbarkeit eines Programmes wird dadurch meistens nicht verbessert...