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

Kys*_*Kys 160 printing perl hash

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

不使用while循环将是最优选的(例如,单线程将是最佳的).

tet*_*ino 241

Data :: Dumper是你的朋友.

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

将输出

$VAR1 = {
          'def' => [
                     4,
                     5,
                     6
                   ],
          'abc' => 123
        };
Run Code Online (Sandbox Code Playgroud)

  • 注意在%前面斜线的重要性 (16认同)
  • @shampoo斜杠运算符创建一个引用,有点像C和C++中的`&`运算符.在这种情况下重要的原因是,在Perl中,如果你调用一个带有哈希值的函数作为参数,那个哈希值会被整理并扩展成多个参数 - 所以`%hsh =("a"=> 1," b"=> 2); foo(%hsh);`相当于`foo("a",1,"b",2)`.如果您希望函数对哈希本身进行操作,则需要传递对哈希的引用:`foo(\%hsh);`请参阅http://perldoc.perl.org/perlsub.html#Pass-by -参考 (14认同)
  • 在%前面添加斜杠是什么意思? (5认同)
  • 原始海报可能还想查看各种Data :: Dumper选项,特别是打开'Sortkeys'可能非常有用 (3认同)

Jon*_*ehl 60

简单:

print "$_ $h{$_}\n" for (keys %h);
Run Code Online (Sandbox Code Playgroud)

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

while (my ($k,$v)=each %h){print "$k $v\n"}
Run Code Online (Sandbox Code Playgroud)

  • Sleazy:打印"@_ \n",而@_ =每%h (9认同)
  • 此外,在提出效率声明之前进行基准测试(或至少限定您所谈论的效率类型).`for`循环比`while`快至至少10,000键:http://gist.github.com/151792 (4认同)

小智 36

在这里您可以不使用打印 Data::Dumper

print "@{[%hash]}";
Run Code Online (Sandbox Code Playgroud)


Bra*_*ert 23

出于调试目的,我经常使用YAML.

use strict;
use warnings;

use YAML;

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

print "# %variable\n", Dump \%variable;
Run Code Online (Sandbox Code Playgroud)

结果是:

# %variable
---
abc: 123
def:
  - 4
  - 5
  - 6
Run Code Online (Sandbox Code Playgroud)

其他时候我会用Data::Dump.您不需要设置任意数量的变量来使其以比您更好的格式输出它Data::Dumper.

use Data::Dump = 'dump';

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

最近我一直在Data::Printer用于调试.

use Data::Printer;
p %variable;
Run Code Online (Sandbox Code Playgroud)
{
    abc   123,
    def   [
        [0] 4,
        [1] 5,
        [2] 6
    ]
}
Run Code Online (Sandbox Code Playgroud)

(终端上的结果可以更加丰富多彩)

与我在此处显示的其他示例不同,此示例仅用于显示目的.如果您转储绑定变量或对象的结构,则更容易显示.

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;
Run Code Online (Sandbox Code Playgroud)
{
    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"
    }
}
Run Code Online (Sandbox Code Playgroud)


Cha*_*ens 11

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

print map { "$_ $h{$_}\n" } keys %h;
Run Code Online (Sandbox Code Playgroud)

要么

print "$_ $h{$_}\n" for keys %h;
Run Code Online (Sandbox Code Playgroud)

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

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


Axe*_*man 10

我最喜欢的:Smart ::评论

use Smart::Comments;
# ...

### %hash
Run Code Online (Sandbox Code Playgroud)

而已.

  • 我并不是说他们没有责任,但他们不太可能是他们首先寻找的东西.在我不知道为什么上面的代码打印出来之前,从未见过Smart Comments模块.我可以花几天时间跳过评论,甚至不处理它,因为评论不应该做任何事情.让他们做某事非常糟糕.只要它们不改变程序的行为,它们就可以用于生成文档等. (7认同)
  • 对不起,我向我投了一些劫持评论实际功能的东西.维护程序员可以花一整天的时间来弄清楚为什么这样的代码会打印出意想不到的东西. (5认同)
  • @MikeKulls,np.这是一个源过滤器,所以我理解.此外,编写脚本来检查我投入生产准备的每个模块,它不会"使用"`Smart :: Comments`,我也从这个角度看待它.但是对于计数器来说,"Smart :: Comments"非常适合作为*作用域*模块,在任何不使用*SC的模块中都不应该有输出行为.因此,使用*use*语句将问题隔离到那些范围.如果你说维护程序员没有责任阅读包含模块的文档,我不能同意.不过,谢谢你的评论 (2认同)

Pau*_*han 5

循环:

foreach(keys %my_hash) { print "$_ / $my_hash{$_}\n"; }
Run Code Online (Sandbox Code Playgroud)

功能性

map {print "$_ / $my_hash{$_}\n"; } keys %my_hash;
Run Code Online (Sandbox Code Playgroud)

但为了纯粹的优雅,我不得不选择 wrang-wrang's。对于我自己的代码,我会选择我的 foreach。或者 tetro 的 Dumper 使用。

  • 您对 `foreach` 和 `map` 的使用在功能上没有区别。`map` 应该用于列表转换,而不是在 void 上下文中模拟 for 循环 (3认同)