【发布时间】:2015-07-16 21:53:18
【问题描述】:
如何在 Perl 中打印散列,以便在每行打印 3 个键值对?
print %hash;
这将打印一行中的每个键值对。
【问题讨论】:
-
几乎没有人阅读这个问题。
如何在 Perl 中打印散列,以便在每行打印 3 个键值对?
print %hash;
这将打印一行中的每个键值对。
【问题讨论】:
要显示散列,以便“每行打印 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 以获得更大改进的版本。
【讨论】:
一个非常简单的方法是将所有的键和值复制到一个数组中,然后一次打印六(三对)
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
【讨论】:
你可以使用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不是核心模块,可能需要安装
谢谢大家。我试过了,效果很好。
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";
【讨论】:
如果您真的只想打印哈希并检查值以进行调试或分析,请使用
use Data::Dumper;
print Dumper(\%hash);
这会打印任意 n 个级别的哈希键和值
【讨论】: