Arrays 如何从数组的perl散列中获取前n个值

Arrays 如何从数组的perl散列中获取前n个值,arrays,perl,hash,Arrays,Perl,Hash,专家们, 我有一个perl中的数组散列,我想打印前2个值 my %dramatis_personae = ( humans => [ 'hamnet', 'shakespeare', 'robyn', ], faeries => [ 'oberon', 'titania', 'puck', ], other => [ 'morpheus, lord of dreams' ], ); foreach my $group (keys %dramatis_p

专家们, 我有一个perl中的数组散列,我想打印前2个值

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";}
}
我得到的输出是 “哈姆内特 莎士比亚 奥伯伦 二氧化钛 莫菲斯 梦幻之王“ 这基本上是每个键的前两个数组值。但我希望输出为:

哈姆内特 莎士比亚


请告诉我如何才能得到这个结果。谢谢

散列是无序的,所以您要求实现的是不可能的。除非您对钥匙和钥匙的顺序有一定的了解,否则您所能得到的最接近的钥匙可能会产生以下任何一种:

  • 'hamnet'、“莎士比亚”
  • 'oberon'、'titania'
  • “梦幻之王莫斐斯”、“哈姆内特”
  • “梦幻之王莫斐斯”、“奥伯伦”
以下是实现此功能的实现:

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;

散列是无序的,所以您要求实现的是不可能的。除非您对钥匙和钥匙的顺序有一定的了解,否则您所能得到的最接近的钥匙可能会产生以下任何一种:

  • 'hamnet'、“莎士比亚”
  • 'oberon'、'titania'
  • “梦幻之王莫斐斯”、“哈姆内特”
  • “梦幻之王莫斐斯”、“奥伯伦”
以下是实现此功能的实现:

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;

散列的键没有顺序,所以您应该自己指定键的顺序。然后,您可以从指定的每个键连接数组,并从结果数组中获取前两个值,这是您想要的吗

print "\t$_\n" foreach (map {(@{$dramatis_personae{$_}})} qw/humans faeries other/)[0..1];

散列的键没有顺序,所以您应该自己指定键的顺序。然后,您可以从指定的每个键连接数组,并从结果数组中获取前两个值,这是您想要的吗

print "\t$_\n" foreach (map {(@{$dramatis_personae{$_}})} qw/humans faeries other/)[0..1];

散列没有一组有序的值,您需要用另一种方式来构造它。您可以使用获取所有值,然后从中分割前两个元素,但结果未定义。哈希没有有序的值集,您需要以另一种方式对其进行结构。您可以使用获取所有值,然后从中分割前两个元素,但结果未定义。