@_
は、あなたのスコープにスコープがあります。変更は外部には見られません。
あなたは
@_
の
要素を変更すると、サブの外スカラーに影響を与えたことに気づいたが、
@_
の既存
要素は、呼び出し元でスカラーにエイリアスされているためです。しかし@_
自体はローカル変数なので、要素の追加と削除は呼び出し元には影響しません。 around
を使用すると、元のメソッドに別の@_
を渡すことができます。 Class/Method/Modifiers.pm
に&$method;
に$method->(@_);
を変更すると、あなたがやりたいことを可能にするであろうと
around 'MIME::Lite::__opts' => sub {
my $orig = shift;
return $orig->(@_, 'SSL');
};
注意(あなたのサブを持つことは、発信者の@_
代わりに、独自にそれを与えているのを使用します)。しかし、それはafter
で対称性がなくなり、戻り値を操作する方法がありません。
grep { s/^Hello$/SSL/ } @_; # OK - changes $_[1]
いいえ、それは大丈夫ではありません。
まず、
grep { s/^Hello$/SSL/ } @_;
はあなたがやるべきではない、と述べた
s/^Hello$/SSL/ for @_;
を書くための貧弱な方法です
map { s/^Hello$/SSL/ } @_;
を書くための貧弱な方法ですそれらのいずれか。彼らは "本当の"呼び出し元の引数を変更するので、厄介な副作用が発生する可能性があります。
それを押しても動作すると主張しても、次のように見えるとクラッシュします!
before method => sub {
s/^Hello$/SSL/ for @_;
};
$o->method("Hello"); # Dies: Can't modify constant item in substitution