2017-08-09 4 views

答えて

2

@_は、あなたのスコープにスコープがあります。変更は外部には見られません。

あなたは @_要素を変更すると、サブの外スカラーに影響を与えたことに気づいたが、 @_の既存 要素は、呼び出し元でスカラーにエイリアスされているためです。しかし@_自体はローカル変数なので、要素の追加と削除は呼び出し元には影響しません。

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 
関連する問題