如何从数组

时间:2016-03-17 01:39:21

标签: arrays perl hash

专家,   我在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";}
}

我得到的输出是 “哈姆奈特 莎士比亚 奥伯伦 二氧化钛 睡眠 梦想之王“ 这基本上是每个键的前两个数组值。但我希望输出为:

哈姆奈特 莎士比亚

请告知我如何获得此结果。谢谢!

2 个答案:

答案 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;