サブルーチン

引数を指定しないと、暗黙に@_が渡される。
かつ引数は参照渡しになる。

my @list = qw(1 2 3 4 5);
test(@list);

sub test {
    &print_args;
    &change_args;
    &print_args;
}
sub print_args {
   print "@_\n";
}
sub change_args {
    @_ = qw(6 7 8 9 0);
}

実行結果

1 2 3 4 5
6 7 8 9 0


こういう場合ももちろん参照渡し

my $abc = "abc";
by_reference($abc);
print $abc,"\n";

sub by_reference {
    $_[0] = "by_reference";
}

実行結果

by_reference

最後に、戻り値はreturnで明示しなければ最後に評価した式だよんという話。

my $foo = &last;
print $foo, "\n";
sub last {
    10;
}

実行結果

10