Practice of Programming

プログラム とか Linuxとかの話題

JPerl Advent Calendar 2009 12日目

JPerl Advent Calendar 2009 の Hacker Trackで、Tie::Traceについて書きました。

Tie::Traceで簡単に変数の中身を追う

ちょっとコードが変だったんで、先ほど修正しました(余計なのがあったのと、コードとメッセージの不一致)

記事をcommitする際に、gitリポジトリをこわしてしまい、大変ご迷惑をおかけしました。
yappoさん、すみませんでした&修復ありがとうございました m(__)m
たぶん、原因は、push 中に ctrl-c 押してしまったことかと思われます。
以後、気をつけます...。

文中で Mouse の line 2 について

わかんないと書いてましたが、追いました。


以下のメッセージですね。

{name} => 'ktat' at accessor for name (.../Mouse/Meta/Method/Accessor.pm) line 2.
{height} => 173 at accessor for age (.../Mouse/Meta/Method/Accessor.pm) line 2.

デバッガで適当にあたりを付けていると、Mouse::Meta::Method::Accessor の、_generate_accessor が関数を文字列($accessor)として作っています。
その後、evalって、コードにしているようです。デバッガから表示したところ、以下のコードでした。

sub {
if (scalar(@_) >= 2) {
return $_[0]->{q{name}} = $_[1];
}
return $_[0]->{q{name}};
}

これだと、line 3 になっちゃうんだけど、これはデバッガか噛んでるせいなのかな?
よくわからんけど、デバッガで走らせると,Tie::Traceのメッセージもline 3 となっちゃいます。

まぁ、間違いなかろうとは思ったのですが、一応、確認しときました。
Mouse/Meta/Method/Accessor.pm

26                       . "sub {warn 1;\n";
....
58              $accessor .= "$slot = $value;\n; warn 2;return $slot";

これで、

1 at accessor for name (/usr/local/share/perl/5.8.8/Mouse/Meta/Method/Accessor.pm) line 2.
{name} => 'ktat' at accessor for name (/usr/local/share/perl/5.8.8/Mouse/Meta/Method/Accessor.pm) line 3.
 at sample9.pl line 14.
2 at accessor for name (/usr/local/share/perl/5.8.8/Mouse/Meta/Method/Accessor.pm) line 4.

と、なりました。解決。


ただ、なんで、"accessor for name"というメッセージが出るのかは...追ってません。
Mooseはなんで、アクセサを定義した場所になるのかも...追ってません。