首页 文章

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

提问于
浏览
143

我继续打印我的哈希值为#sokets / #distributed . 如何打印哈希的内容?

不使用 while 循环是最优选的(例如,one-liner将是最好的) .

11 回答

  • 10

    这里如何打印而不使用Data::Dumper

    print "@{[%hash]}";
    
  • 21

    循环:

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

    实用

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

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

  • 1

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

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

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

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

    简单:

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

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

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

    出于调试目的,我经常使用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"
        }
    }
    
  • 29

    在我的经历中最简单的方法是使用Dumpvalue .

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

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

  • 222

    我的最爱:Smart::Comments

    use Smart::Comments;
    # ...
    
    ### %hash
    

    而已 .

  • 55

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

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

    要么

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

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

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

  • 11

    Data::Dumper是你的朋友 .

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

    将输出

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

    如果你想变得迂腐并将它保持在一行(没有使用陈述和shebang),那么我将从tetromino的答案中剔除并建议:

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

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

相关问题