小池啓仁 ヒロヒト応援ブログ By はてな

小池啓仁(コイケヒロヒト)の動画など。

小池啓仁 ヒロヒト応援ブログ By はてな

@_の要素の$_[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 5
http://d.hatena.ne.jp/lolstep/20080705/1215241002

ということです。なぜ、こんな仕様にしたのだろうか・・・。

理由は以下を参照。