Subscribed unsubscribe Subscribe Subscribe

連想配列の中身をワンライナーで読みやすくdumpしたい

連想配列(ハッシュ)の中身を表示させるとき。普通は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も今年に入ってから触り始めたばっかりだし、もうちょっとそういうデータ形式についての理解も深めよう。