Perlの引数の評価戦略が正格ではないとき

cf. 評価戦略 - Wikipedia

サブルーチンの引数として渡す式がハッシュの要素の場合、その評価は正格ではなく、要素の取得は必要になるまで行われません

#!perl
use 5.14.0;
use warnings;
use strict;

package MyTieHash {
    use Carp qw(longmess);
    use Tie::Hash;
    use parent -norequire, qw(Tie::StdHash);

    sub FETCH {
        my($self, $k) = @_;
        say longmess "FETCH $k";
        return $self->SUPER::FETCH($k);
    }
}

tie my %h, "MyTieHash";
$h{foo} = "bar";

f($h{foo});

sub f {
    say "in f()";
    say $_[0];
    $_[0] = "baz";
    say $_[0];
}

実行結果:

in f()
FETCH foo at non-strict-eval.pl line 25.
	main::f(undef) called at non-strict-eval.pl line 21

bar
FETCH foo at non-strict-eval.pl line 27.
	main::f('baz') called at non-strict-eval.pl line 21

baz

f() の中に入ってからFETCHが呼ばれていることが分かります。またさらに、参照のたびにFETCHが呼ばれます。

これは予想外の結果になることがあるので、@_の要素を直接参照するのはなるべく避けてサブルーチンの冒頭で引数を展開するのがいいですね。