私たちは大規模な Perl アプリケーションをオブジェクト指向インターフェイス、特にデータ モデル向けにゆっくりとリファクタリングしています。煩わしい部分は、スタック トレースの有用性が低下することです。捏造された例を挙げると:以前。
sub send_message {
my ($user_id, $message) = @_;
...
Carp::confess('test');
}
# output:
test at example.pm line 23
foo('42', 'Hello World') called at example.pl line 5
後。
sub send_message {
my ($user, $message) = @_;
...
Carp::confess('test');
}
# output:
test at example.pm line 23
foo('MyApp::Model::User=HASH(0x2c94f68)', 'Hello World') called at example.pl line 5
そのため、どのユーザーが に渡されたかはわかりませんfoo()
。クラス名 (既に文書化されています) とオブジェクトのメモリ アドレスのみが表示されます。
overload.pm を使用して、モデル クラスに文字列化演算子をインストールしようとしました。
use overload ( '""' => \&stringify );
sub stringify {
my ($self) = @_;
return sprintf '%s[id=%d]', ref($self), $self->id;
}
しかし、これは longmess には影響しません。私が欲しいのは次のようなものです:
test at example.pm line 23
foo('MyApp::Model::User[id=42]', 'Hello World') called at example.pl line 5
つまりfoo()
、オブジェクトのstringify()
メソッドを使用して最初のパラメータを表示する必要があります。どうすればそれを達成できますか?