如何在Perl中打印哈希的内容?

时间:2009-07-21 23:14:34

标签: perl hash printing

我继续将哈希打印为#sokets / #dorted。 如何打印哈希的内容?

最好不使用while循环(例如,one-liner最好)。

11 个答案:

答案 0 :(得分:230)

Data::Dumper是你的朋友。

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

将输出

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

答案 1 :(得分:58)

简单:

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

优雅,但实际上慢了30%(!):

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

答案 2 :(得分:33)

此处如何在不使用Data::Dumper

的情况下进行打印
print "@{[%hash]}";

答案 3 :(得分:21)

出于调试目的,我经常使用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更好的格式输出。

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"
    }
}

答案 4 :(得分:11)

答案取决于哈希中的内容。如果你有一个简单的哈希简单

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

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

会这样做,但如果你有一个用引用填充的哈希,那么你可以使用那些引用这些引用并生成合理输出的东西。这种引用的遍历通常称为序列化。有许多模块实现了不同的风格,一些比较流行的模块是:

由于Data::Dumper是核心Perl库的一部分,它可能是最受欢迎的;但是,其他一些模块可以提供非常好的东西。

答案 5 :(得分:10)

我的最爱:Smart::Comments

use Smart::Comments;
# ...

### %hash

就是这样。

答案 6 :(得分:4)

循环:

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

功能

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

但是对于纯粹的优雅,我必须选择争吵。对于我自己的代码,我会选择我的foreach。或者tetro的Dumper使用。

答案 7 :(得分:2)

根据我的经验,最简单的方法就是使用Dumpvalue

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

像魅力一样工作,你不必担心格式化哈希,因为它像Perl调试器那样输出它(非常适合调试)。另外,Dumpvalue包含在Perl模块的库存中,所以如果你支持某种严厉的代理(比如我在工作),你就不必乱用CPAN。

答案 8 :(得分:1)

如果你想变得迂腐并将它保持在一条线上(没有使用陈述和shebang),那么我会撇开tetromino的回答并建议:

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

除了使用匿名哈希跳过临时变量之外,没有做任何特殊事情;)

答案 9 :(得分:1)

我为哈希的每个元素添加一个空格以便很好地看到它:

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

答案 10 :(得分:1)

我真的很想在一个班轮代码中对键进行排序:

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