【问题标题】:How to get first n values from perl Hash of arrays如何从数组的perl哈希中获取前n个值
【发布时间】:2016-03-17 10:44:57
【问题描述】:

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

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

哈姆网 莎士比亚

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

【问题讨论】:

  • 哈希没有一组有序的值,您需要以另一种方式构造它。您可以使用perldoc.perl.org/functions/values.html 获取所有值,然后从中切出前两个元素,但结果未定义。

标签: arrays perl hash


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    哈希是无序的,因此您要求实现的目标是不可能的。除非您对键及其应在的顺序有所了解,否则您可以获得的最接近的是可以产生以下任何一种的东西:

    • '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;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-06-21
      • 2010-09-08
      • 2016-07-22
      • 2012-09-01
      • 2011-04-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多