子程式引數通過引用傳遞(簽名中的引數除外)

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