[...]
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...