連想配列(ハッシュ)の中身を表示させるとき。普通はData::Dumperモジュールを使って表示すると思う。
$ perl -MData::Dumper -e 'print Dumper { key1 => "value1", key2 => "value2" }' $VAR1 = { 'key2' => 'value2', 'key1' => 'value1' };
でも、コレって見にくい。別にそれを使って新しくハッシュを作るわけじゃないのなら、例えば
key1: value1 key2: value2
という形でkeyとvalueの組を1行ずつ表示させたい。
もちろん、
#!/usr/bin/perl use strict; use warnings; my $hashref = { key1 => 'value1', key2 => 'value2', }; for my $key (keys %$hashref) { print $key, ":", $hashref->{$key}, "\n"; }
というように一度変数に代入したものに対してfor文をまわしてkeyとvalueをprintしてやれば表示はできる。
コレをもっと簡単にできないかなー、と考えて試行錯誤してみた。
上のスクリプトと同じことをワンライナーでやるなら、
$ perl -le '$a = { key1 => "value1", key2 => "value2" }; print "$_:$a->{$_}" for keys %$a'
でもあんまり賢い方法とは思えない。どうにか「1行で」(セミコロンで区切らず、余計な変数を使わずに)エレガントに実行できないものか。
$ perl -le 'print "$_:$a->{$_}" for keys %{$a = { key1 => "value1", key2 => "value2" }}'
セミコロンは消えたが、やはり一度$aとかの変数に代入してやらないといけない。
$ perl -e 'print "$_", $n++ % 2 ? "\n" : ":" for %{{ key1 => "value1", key2 => "value2" }}'
かなり無理矢理な手法。連想配列の参照から変数への代入はなくなるけど、別の部分で余計な変数が登場w
結局のところ、これ以上いい方法は思いつかなかった orz
で、ちょこちょこ調べてみたところ、YAML::Dumpがイイらしい、というところに行き着いた。
確かに思い浮かべてた理想型を考えてみれば、これはYAMLじゃないかw
$ perl -MYAML -e 'print Dump { key1 => "value1", key2 => "value2" }' --- key1: value1 key2: value2
うはwww テラ簡単wwwwww
YAMLってまだほとんど使ったことなくてよく分かってないなぁ。
JSONも今年に入ってから触り始めたばっかりだし、もうちょっとそういうデータ形式についての理解も深めよう。