Whiteのふりーとーく

evaluation rules

About this Page |過去分一覧

近頃版/another blog@hatena/Wiki/BBS

< フォローアップ:スケールとマーケティング | Top 3 best (modern) game design of me. >

 

evaluation rules

以下のようなコードを書いた

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

やあ、これが私の望んだ結果というものだ。

_きょーくん。おもいつきであんまりトリッキーなコードを書こうとするのはたいがいにしましょー。

TrackBack ping url:

名前

TrackBack:


御意見・御感想の宛先white@niu.ne.jp