web-dev-qa-db-ja.com

Perlでハッシュの内容を印刷するにはどうすればよいですか?

ハッシュを#バケット数/#割り当てとして印刷し続けます。ハッシュの内容を印刷するにはどうすればよいですか?

whileループを使用しないことが最も望ましいでしょう(たとえば、 one-liner が最適です)。

150
Kys

Data :: Dumper はあなたの友達です。

use Data::Dumper;
my %hash = ('abc' => 123, 'def' => [4,5,6]);
print Dumper(\%hash);

出力します

$VAR1 = {
          'def' => [
                     4,
                     5,
                     6
                   ],
          'abc' => 123
        };
231
tetromino

簡単:

print "$_ $h{$_}\n" for (keys %h);

エレガントですが、実際には30%遅くなります(!):

while (my ($k,$v)=each %h){print "$k $v\n"}
58
Jonathan Graehl

ここで Data::Dumper を使用せずに印刷する方法

print "@{[%hash]}";
33
user966588

デバッグのために、私はよく YAML を使用します。

use strict;
use warnings;

use YAML;

my %variable = ('abc' => 123, 'def' => [4,5,6]);

print "# %variable\n", Dump \%variable;

結果:

# %variable
---
abc: 123
def:
  - 4
  - 5
  - 6

他の場合は Data::Dump を使用します。 Data::Dumper の場合よりも多くの変数を設定してNice形式で出力する必要はありません。

use Data::Dump = 'dump';

print dump(\%variable), "\n";
{ abc => 123, def => [4, 5, 6] }

最近では、デバッグに Data::Printer を使用しています。

use Data::Printer;
p %variable;
{
    abc   123,
    def   [
        [0] 4,
        [1] 5,
        [2] 6
    ]
}

(結果は端末上でよりカラフルになる可能性があります)

ここで示した他の例とは異なり、この例は表示のみを目的として明示的に設計されています。タイ変数またはオブジェクトの構造をダンプすると、より簡単に表示されます。

use strict;
use warnings;

use MTie::Hash;
use Data::Printer;

my $h = tie my %h, "Tie::StdHash";
@h{'a'..'d'}='A'..'D';
p %h;
print "\n";
p $h;
{
    a   "A",
    b   "B",
    c   "C",
    d   "D"
} (tied to Tie::StdHash)

Tie::StdHash  {
    public methods (9) : CLEAR, DELETE, EXISTS, FETCH, FIRSTKEY, NEXTKEY, SCALAR, STORE, TIEHASH
    private methods (0)
    internals: {
        a   "A",
        b   "B",
        c   "C",
        d   "D"
    }
}
21
Brad Gilbert

答えはハッシュの内容によって異なります。単純なハッシュがある場合は、単純な

print map { "$_ $h{$_}\n" } keys %h;

または

print "$_ $h{$_}\n" for keys %h;

実行できますが、参照が設定されたハッシュがある場合は、それらの参照を調べて適切な出力を生成できるものになります。この参照の探索は通常、シリアル化と呼ばれます。さまざまなスタイルを実装する多くのモジュールがありますが、いくつかのより一般的なものは次のとおりです。

Data::DumperはコアPerlライブラリの一部であるため、おそらく最も人気があります。ただし、他のモジュールの一部には非常に優れた機能があります。

11
Chas. Owens

私のお気に入り: Smart :: Comments

use Smart::Comments;
# ...

### %hash

それでおしまい。

10
Axeman

ループ:

foreach(keys %my_hash) { print "$_ / $my_hash{$_}\n"; }

機能的

map {print "$_ / $my_hash{$_}\n"; } keys %my_hash;

しかし、純粋な優雅さのために、私はラングランを選択する必要があります。私のコードでは、foreachを選択します。またはtetroのDumper使用。

4
Paul Nathan

私の経験で最も簡単な方法は、単に Dumpvalue を使用することです。

use Dumpvalue;
...
my %hash = { key => "value", foo => "bar" };
my $dumper = new DumpValue();
$dumper->dumpValue(\%hash);

チャームのように機能し、ハッシュをフォーマットすることを心配する必要はありません。Perlデバッガーのようにハッシュを出力するためです(デバッグに最適)。さらに、Dumpvalueは標準のPerlモジュールセットに含まれているため、ある種の過酷なプロキシ(私が仕事をしているような)の背後にいる場合、CPANをいじる必要はありません。

2
Weegee

ハッシュのすべての要素に1つのスペースを追加して、よく見ることができます。

print map {$_ . " "} %h, "\n";
1
carlos_lm

あなたがped慢になり、それを1行にしたい場合(使用文とシバンなしで)、私はテトロミノの答えからちょっと便乗し、提案します:

print Dumper( { 'abc' => 123, 'def' => [4,5,6] } );

匿名ハッシュを使用して一時変数をスキップする以外に特別なことは何もしません;)

1
Kyle Walsh

私は本当に1つのライナーコードでキーをソートするのが好きです:

print "$_ => $my_hash{$_}\n" for (sort keys %my_hash);
1
labist