专家, 我在perl中有一个数组哈希,我想打印前两个值。
my %dramatis_personae = (
humans => [ 'hamnet', 'shakespeare', 'robyn', ],
faeries => [ 'oberon', 'titania', 'puck', ],
other => [ 'morpheus, lord of dreams' ],
);
foreach my $group (keys %dramatis_personae) {
foreach (@{$dramatis_personae{$group}}[0..1]) { print "\t$_\n";}
}
我得到的输出是 “哈姆奈特 莎士比亚 奥伯伦 二氧化钛 睡眠 梦想之王“ 这基本上是每个键的前两个数组值。但我希望输出为:
哈姆奈特 莎士比亚
请告知我如何获得此结果。谢谢!
答案 0 :(得分:2)
哈希键未订购,因此您应自行指定键排序。然后你可以连接指定的每个键的数组,并从结果数组中获取前两个值,这是你想要的吗?
print "\t$_\n" foreach (map {(@{$dramatis_personae{$_}})} qw/humans faeries other/)[0..1];
答案 1 :(得分:0)
哈希是无序的,所以你要求实现的是不可能的。除非你对键和它们应该处于的顺序有一些了解,否则你能得到的最接近的东西可以产生以下任何一个:
'hamnet', 'shakespeare'
'oberon', 'titania'
'morpheus, lord of dreams', 'hamnet'
'morpheus, lord of dreams', 'oberon'
以下是执行此操作的实现:
my $to_fetch = 2;
my @fetched = ( map @$_, values %dramatis_personae )[0..$to_fetch-1];
以下是大型结构的更高效版本。它还可以更好地处理数据不足:
my $to_fetch = 2;
my @fetched;
for my $group (values(%dramatis_personae)) {
if (@$group > $to_fetch) {
push @fetched, @$group[0..$to_fetch-1];
$to_fetch = 0;
last;
} else {
push @fetched, @$group;
$to_fetch -= @$group;
}
}
die("Insufficient data\n") if $to_fetch;