- 2006-04-25 (火)
- Perl
参考document: perldoc attributes /lvalue
関数用の built-in attributes に lvalue ってのがあります:
sample.pl
use strict; package FooClass; sub new { return bless({ prop => 'orginal' },shift); } sub prop : lvalue { shift->{prop}; } package main; my $obj = FooClass->new(); print "$obj->{prop}\n"; $obj->prop = 'modified'; print "$obj->{prop}\n";
実行結果
$ perl sample.pl orginal modified
インスタンスプロパティを左辺値として使えるようになるのでちょっといいかなと思っていたんですけど、落とし穴を見つけたっぽいです。
perl debug モードだと正しく動作しない
参考document: perldoc perldebug
ステップイン/アウト、ブレークポイントを使って華麗にスクリプトのデバッグが可能な -d モードで同スクリプトを動かすと、lvalue attribute がうまく動作しません。左辺値として機能しないようです。※ perl 5.8.4 と 5.8.5 で動作確認済み
先ほどのサンプルコード sample.pl をデバッグモードで実行:
$ perl -d sample.pl Loading DB routines from perl5db.pl version 1.25 Editor support available. Enter h or `h h' for help, or `man perldebug' for more help. main::(sample.pl:14): my $obj = FooClass->new(); DB<1> n main::(sample.pl:15): print "$obj->{prop}\n"; DB<1> n orginal main::(sample.pl:16): $obj->prop = 'modified'; DB<1> n main::(sample.pl:17): print "$obj->{prop}\n"; DB<1> n orginal
俺の凡ミスじゃね?
こんな判り易いバグを世の perl hacker な方々が放置しておくはずが無いと思います。でも google で 'perl lvalue debug' とかで探しても、目立った報告記事やらが見つかりませんでした(俺の検索能力がイケてない?) 。
こういう時は perl mongers mailing list なり cpan 系 mailing list に聞いてみればいいの?てか俺の凡ミスなの?よーわからん、てな感じでこうしてブログにポストしてみた次第。 素敵な perl monk が反応してくれたら嬉しいな。
やはりバグな模様 (04/28追記)
はてなブックマークにて charsbar さんからコメント貰いました:
http://search.cpan.org/~domizio/OOTools-2.21/lib/Class/props.pm のKNOWN ISSUEでも紹介されていますね
このリンク先をきっかけに、色々情報漁っていった結果、perl 自身のドキュメントにも記述がある事が確認できました:
LVALUE functions in the debugger
The old perltodo notes that lvalue functions don't work in the debugger. This would be good to fix.
charsbarさんコメント感謝ですー。※検索語 ' perl lvalue debug' では何も見つからなかったものの、 'perl lvalue debugger' だと大漁にヒットする罠 orz
- Newer: アルケミスト - 心に残ったメッセージ
- Older: bad UI