【发布时间】:2010-11-03 20:25:54
【问题描述】:
我一直确信,如果我向 Perl 子例程传递一个简单的标量,它就永远不会在子例程之外改变它的值。那就是:
my $x = 100;
foo($x);
# without knowing anything about foo(), I'm sure $x still == 100
因此,如果我希望 foo() 更改 x,我必须将其传递给 x 的引用。
然后我发现不是这样的:
sub foo {
$_[0] = 'CHANGED!';
}
my $x = 100;
foo($x);
print $x, "\n"; # prints 'CHANGED!'
数组元素也是如此:
my @arr = (1,2,3);
print $arr[0], "\n"; # prints '1'
foo($arr[0]);
print $arr[0], "\n"; # prints 'CHANGED!'
这让我有点吃惊。这是如何运作的?子程序不是只获取参数的value吗?它怎么知道它的地址?
【问题讨论】:
-
Perl 不是 C。不要期望它表现得像 C 或任何 C 派生语言,如 C++ 或 Java。
-
您的问题是关于
@_,而不是$_。而@_中的sub通常包含别名而不是值的副本。因此,如果您不希望在sub中出现这种行为,请务必在开始时将输入从@_复制到my变量。 -
我相当确定这是有据可查的。
标签: perl pass-by-reference parameter-passing subroutine