通过散列键搜索散列数组及其在 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;
我有一个包含大约 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;