@_の要素の$_[0],$_[1]等は、格納するべきアドレスが可変!
普通、配列は以下のように、要素毎に代入しても、リストで一気に代入しても、要素のアドレスは変わりません。
use strict; use warnings; my @array; $array[0] = "1"; $array[1] = "2"; print "array[0]-> " . \$array[0] . "\n"; print "array[1]-> " . \$array[1] . "\n"; print "\@array-> " . $array[0] . $array[1] . "\n"; @array = ("A", "B"); print "array[0]-> " . \$array[0] . "\n"; print "array[1]-> " . \$array[1] . "\n"; print "\@array-> " . $array[0] . $array[1] . "\n";
C:\test>perl haiaddre.pl array[0]-> SCALAR(0x1625e80) array[1]-> SCALAR(0x1625f40) @array-> 12 array[0]-> SCALAR(0x1625e80) array[1]-> SCALAR(0x1625f40) @array-> AB
しかし、以下のように@_配列の要素の$_[0],$_[1]等は、格納するべきアドレスが可変なのです。
#!/usr/bin/perl use strict; use warnings; my @array = ("1", "2", "3", "4", "5"); print "array-> @array\n"; print "array[0]-> " . \$array[0] . "\n"; print "array[1]-> " . \$array[1] . "\n"; arg1(@array); print "array-> @array\n"; sub arg1 { my $cnt = @_; print ("in arg1 cnt -> $cnt\n"); print "\$_[0]-> " . \$_[0] . "\n"; print "\$_[1]-> " . \$_[1] . "\n"; @_ = ("A", "B", "C", "D", "E"); print "\$_[0]-> " . \$_[0] . "\n"; print "\$_[1]-> " . \$_[1] . "\n"; $_[0] = "UVW"; $_[1] = "XYZ"; }C:\MyWorks\Perl\arg>perl arg15.pl array-> 1 2 3 4 5 array[0]-> SCALAR(0x275f50) array[1]-> SCALAR(0x276004) in arg1 cnt -> 5 $_[0]-> SCALAR(0x275f50) $_[1]-> SCALAR(0x276004) $_[0]-> SCALAR(0x185355c) $_[1]-> SCALAR(0x1853550) array-> 1 2 3 4 5http://d.hatena.ne.jp/lolstep/20080705/1215241002
ということです。なぜ、こんな仕様にしたのだろうか・・・。
理由は以下を参照。