子程序参数通过引用传递(签名中的参数除外)
Perl 中的子例程参数通过引用传递,除非它们在签名中。这意味着 sub 中的 @_
数组的成员只是实际参数的别名。在下面的例子中,主程序中的 $text
在子程序调用后被修改,因为 sub 中的 $_[0]
实际上只是同一个变量的不同名称。第二次调用会引发错误,因为字符串文字不是变量,因此无法修改。
use feature 'say';
sub edit {
$_[0] =~ s/world/sub/;
}
my $text = "Hello, world!";
edit($text);
say $text; # Hello, sub!
edit("Hello, world!"); # Error: Modification of a read-only value attempted
为了避免破坏调用者的变量,重要的是将 @_
复制到本地范围的变量(my ...
),如创建子例程中所述。