子程序参数通过引用传递(签名中的参数除外)

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 ...),如创建子例程中所述。