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