近頃版/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
やあ、これが私の望んだ結果というものだ。
_きょーくん。おもいつきであんまりトリッキーなコードを書こうとするのはたいがいにしましょー。