【问题标题】:Printing groups of key/value pairs in hash在散列中打印键/值对组
【发布时间】:2015-07-16 21:53:18
【问题描述】:

如何在 Perl 中打印散列,以便在每行打印 3 个键值对?

print %hash;

这将打印一行中的每个键值对。

【问题讨论】:

  • 几乎没有人阅读这个问题。

标签: perl hash


【解决方案1】:

要显示散列,以便“每行打印 3[n] 个键值对”,您可以使用计数器 ($n) 和 %(模运算)来确定何时打印“ \n"。演示:

use Modern::Perl;

my %h = ();
for (0..7) {
    $h{$_} = chr(65 + $_);
}
print %h, "\n";
my $cols = +$ARGV[0] || 5;
my $n = -$cols;
for my $key (keys %h) {
    print $key, ' => ', $h{$key}, 0 == ++$n % $cols ? "\n" : "\t\t";
}
print $n % $cols ? "\n------" : "------";

输出:

perl -w 31444449.pl 1
6G4E1B3D0A7H2C5F
6 => G
4 => E
1 => B
3 => D
0 => A
7 => H
2 => C
5 => F
------

perl -w 31444449.pl
6G4E1B3D0A7H2C5F
6 => G          4 => E          1 => B          3 => D          0 => A
7 => H          2 => C          5 => F
------

perl -w 31444449.pl 3
6G4E1B3D0A7H2C5F
6 => G          4 => E          1 => B
3 => D          0 => A          7 => H
2 => C          5 => F
------

然而,鲍罗丁的解决方案更简单。

请参阅mpapec answer 以获得更大改进的版本。

【讨论】:

  • @Downvoter - 请告诉我我做错了什么。我真的很想改进我的答案。
  • 是我,我道歉;像大多数人一样,我显然没有看到对 3 个键值对的要求。在您编辑答案之前,我无法取消投票
  • @fugu - 感谢您的反馈,无需道歉。
【解决方案2】:

一个非常简单的方法是将所有的键和值复制到一个数组中,然后一次打印六(三对)

use strict;
use warnings;

my %h = map { $_ => 1 } 'A' .. 'H';

my @kv = %h;
while ( my @row = splice @kv, 0, 6 ) {
  print "@row\n";
}

输出

B 1 C 1 A 1
D 1 E 1 G 1
F 1 H 1

【讨论】:

    【解决方案3】:

    你可以使用natatime from List::MoreUtils:

    use List::MoreUtils qw/natatime/;
    
    my $it = natatime 6, %ENV;
    while (my @vals = $it->()) {
      print "@vals\n";
    }
    

    List::MoreUtils 不在核心模块中,您需要安装它。

    【讨论】:

    • 这不能回答问题
    • 需要强调的是List::MoreUtils不是核心模块,可能需要安装
    【解决方案4】:

    谢谢大家。我试过了,效果很好。

    my @keylist=sort keys %hash;
     my $counter=0;
     foreach(@keylist){
      #printing the key value pairs
      printf "%-15s :%3d     ",$_,$hash{$_};
      $counter++;
      if($counter==3){
        $counter=0;
       print "\n";
      }
     }
     print "\n";
    

    【讨论】:

      【解决方案5】:

      如果您真的只想打印哈希并检查值以进行调试或分析,请使用

      use Data::Dumper;
      print Dumper(\%hash);
      

      这会打印任意 n 个级别的哈希键和值

      【讨论】:

        猜你喜欢
        • 2013-01-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-01-27
        • 1970-01-01
        • 2014-07-22
        • 2019-01-13
        • 1970-01-01
        相关资源
        最近更新 更多