sub _user_agent_get_basic_credentials_patch {
return ($username, $password);
}
my $agent = LWP::UserAgent->new();
$agent->get_basic_credentials = _user_agent_get_basic_credentials_patch;
これがあなたがしていることなので、ここには1つではなく2つの問題があります。
( $agent->get_basic_credentials() ) = _user_agent_get_basic_credentials_patch();
どちらの場合も、単にサブルーチンを参照するのではなく、サブルーチンを呼び出しています。
assign the result of
'_user_agent_get_basic_credentials_patch'
to the value that was returned from
'get_basic_credentials';
同等のロジック:
{
package FooBar;
sub foo(){
return 5;
}
1;
}
my $x = bless( {}, "FooBar" );
sub baz(){
return 1;
}
$x->foo() = baz();
# 5 = 1;
だから、不平を言うのも不思議ではありません。
同じ理由で、回答の「修正済み」コードも間違っています。別の問題が発生する可能性があります。
$agent->{get_basic_credentials} = _user_agent_get_basic_credentials_patch;
これは、あなたが思っているように機能すると考えると、かなり欠陥のあるロジックです。
それが実際に行っていることは次のとおりです。
1. Dereference $agent, which is a HashRef
2. Set the hash-key 'get_basic_credentials' to the result from _user_agent_get_basic_credentials_patch
機能をまったく割り当てていません。
{
package FooBar;
sub foo(){
return 5;
}
1;
}
my $x = bless( {}, "FooBar" );
sub baz(){
return 1;
}
$x->{foo} = baz();
# $x is now = ( bless{ foo => 1 }, "FooBar" );
# $x->foo(); # still returns 5
# $x->{foo}; # returns 1;
もちろん、モンキー パッチはかなり悪いものであり、そのようなものの特異なインスタンスでメソッドをオーバーライドする方法を見たことがありません。
ただし、できることは次のとおりです。
{
no strict 'refs';
*{'LWP::UserAgent::get_basic_credentials'} = sub {
# code here
};
}
これは get_basic_credentials コード セクションの動作をグローバルに置き換えます (私は多少間違っている可能性があります。誰かが私を修正してください)。
インスタンスごとに本当にそれを行う必要がある場合は、おそらくクラスの継承を少し行い、代わりに派生クラスを構築したり、新しいパッケージを動的に作成したりできます。