近頃版/another blog@hatena/Wiki/BBS
< フォローアップ:スケールとマーケティング | Top 3 best (modern) game design of me. >
以下のようなコードを書いた
while(@_){ $obj->{shift} = shift; }
そしたら思いどおりに動かないな、ということになりYAMLモジュール様を使って調べてみたところ、出来た$objの中身はこんなだった。
--- #YAML:1.0 shift: 6291466
…どうやら$obj->{shift} の'shift'が文字列と判断されているらしい。
_そこで次に以下のようなコードに変更した。
while(@_){ $obj->{ shift(@_) } = shift(@_); }
要は明示的に'shift'が関数だと教えてやればよいのだ。
だが甘かった。
--- #YAML:1.0 0: files 1: command "1007\t30\t3002\z": data_body 3: protocol_version 6291466: program_version
…ハッシュの名前と値が見事に逆。ということは、評価順の問題に違いない。$obj->{ shift(@_) }の中のshiftを先に評価して欲しかったのに、そっちが後まわしになったというわけだ。
_しょうがないので最後に以下のようなコードになった。
while(@_){ my $n = shift; my $v = shift; $obj->{$n} = $v; }
結果、
--- #YAML:1.0 command: 1 data_body: "1007\t30\t3002\z" files: 0 program_version: 6291466 protocol_version: 3
やあ、これが私の望んだ結果というものだ。
_きょーくん。おもいつきであんまりトリッキーなコードを書こうとするのはたいがいにしましょー。