子程式引數通過引用傳遞(簽名中的引數除外)
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 ...
),如建立子例程中所述。