通过散列键搜索散列数组及其在 Perl 中的排序

Search in an array of hashes by the hash key and its sorting in Perl

我有一个包含大约 300 个散列项的散列数组:

@whole = [
          {
            'id' => 112,
            'name' => 'Wheelbase',
            'lang' => 'en'
          },
          {
            'lang' => 'en',
            'name' => 'Width',
            'id' => 57
          },
          {
            'lang' => 'en',
            'id' => 174,
            'name' => 'WLAN'
          },
          {
            'id' => 252,
            'name' => 'Zoom System',
            'lang' => 'en'
          };
];

我想在上面的数据结构中搜索多个键名称,多个名称存储在另一个数组中。

@props = ('Price', 'Market Dominance', 'Market Capitalization');

我的代码是:

use strict;
use warnings;

my (@matching_items, @whole);  # input arrays both
my $id_prop;

@matching_items = grep {
  foreach my $in (@props) {
    if ($_->{name} =~ /^$in$/i) {
        $id_prop = $_->{id};
        print "$id_prop\n";
    }
  }
  } @whole;

print Dumper @matching_items;

未填充@matching_items 中的匹配项目。它返回为空并仅将 id 打印到控制台。我做错了什么?

您正在为 @whole 分配一个引用文字,我将其更改为一个数组。嵌套的 foreach 可以更容易地使用 List::Util::any 编写,这将快捷方式使块评估为真的第一个元素。我还在循环之前将您的 @props 条目小写了一次,并使用 eq 与小写的名称字符串进行比较:

use strict;
use warnings;
use List::Util qw/any/;
use Data::Dumper;
use 5.016;

my @whole = (
          {
            'id' => 112,
            'name' => 'Wheelbase',
            'lang' => 'en'
          },
          {
            'lang' => 'en',
            'name' => 'Width',
            'id' => 57
          },
          {
            'lang' => 'en',
            'id' => 174,
            'name' => 'WLAN'
          },
          {
            'id' => 252,
            'name' => 'Zoom System',
            'lang' => 'en'
          }
);

my @props = ('Price', 'Market Dominance', 'Market Capitalization','Zoom System');

my @props_lc = map {lc} @props;

my @matching_items = grep {
    my $name = lc $_->{name};
    any {$name eq $_} @props_lc;
} @whole;

print Dumper @matching_items;

这是另一种方法:

my @whole = (
    {
        'id' => 112,
        'name' => 'Wheelbase',
        'lang' => 'en'
    },
    {
        'lang' => 'en',
        'name' => 'Width',
        'id' => 57
    },
);

my %props = map {$_ => 1} ('Width', 'Market Dominance', 'Market Capitalization');
my @matching_items = grep { exists $props{$_->{name}} } @whole;