Der Aufruf einer sub kopiert den Variableninhalt nur dann, wenn man es in der sub explizit macht.
also zum Beispiel:
sub passby
{
print length($_[0]), "\n";
}
sub copy
{
my $ausgabe=$_[0];
print length($ausgabe), "\n";
}
Die sub passby bearbeitet die Werte nur, aber kopiert nix, darum läuft sie ziemlich schnell. Die sub copy kopiert den Wert allerdings erst in eine eigene Variable, damit dauert die Ausführung schon länger.
Natürlich liegt der wirkliche Grund in den Interna von perl. Bei einem Subroutinenaufruf wird nix kopiert, sondern nur aliase zwischen den Variablen in @_ und den Parameter gebildet. Das sieht man natürlich schön an dem folgenden Program:
sub anders
{
$_[0]=5;
}
my $x=3;
anders($x); # setzt x auf 5
print $x;
anders(7); # stürzt ab
sub z{if(@_){1while$x[$k=rand 10];t($t=$x[$k]=1)}print map"$z[$x[$_]]$_".($_%3?
"":"\n"),1..9}sub t{$j=0;$x[$_+1]==$t&&($j+=2**$_)for 0..8;z,die"Gewinner $z[$t]
"if grep$_==($j&$_),7,56,73,84,146,273,292,448;z,die"Gleichstand\n"if@x>9&&!grep
!$_,@x}@x=4;@z=qw{. [ (};z$^T&1;while(<>){next if$_>9||$x[$_];t$t=$x[$_]=2;z 1}