如何解决以紧凑和或快速的方式从哈希映射数组中获取特定键的所有值作为数组
my %data= (
'John' => {
'company' => 'xxx','address' => 'San Francisco','contact' => ['phone1','phone2']
},'Alice' => {
'company' => 'yyy','address' => 'Boston','contact' => ['phone3','phone4']
},);
有没有一种方法可以将所有公司名称作为数组提取到变量中而无需遍历哈希图?
即('xxx','yyy')
我尝试了下面的方法,但确实可行,但是想要一个更紧凑的解决方案,类似于下面提到的python中的列表理解。
@companies = ();
for my $person_data (values %data)
{
push(@companies,$person_data{'company'});
}
在python中,我可以使用列表理解来实现此目的,如下所示:
companies = [person_data['company'] for person_data in data.values()]
解决方法
与Perl等效的Python列表理解为map
,因此您可以使用@companies = map { $_->{company} } values %name_to_contact;
之类的东西。
示例:
#!/usr/bin/env perl
use warnings;
use strict;
use feature qw( say );
my %name_to_contact = (
'John' => {
'company' => 'xxx','address' => 'San Francisco','contact' => ['phone1','phone2']
},'Alice' => {
'company' => 'yyy','address' => 'Boston','contact' => ['phone3','phone4']
},);
my @companies = map { $_->{company} } values %name_to_contact;
say "@companies";
# Prints:
# xxx yyy
在这里,我使用了一个有效的Perl哈希,与您显示的json等效。我在适当的地方使用了单引号,在不需要变量插值的地方。values %name_to_contact
:返回输入哈希值的无序列表,即匿名哈希表。map { $_->{company} } values %name_to_contact
:获取输入哈希值的列表,并为每个元素(匿名哈希)将其分配给$_
。 $_->{company}
是此匿名哈希的company
键的值。就是这样!
请注意,您可以在一个语句中将map
的多个调用链接在一起,这是一个强大的结构,通常比诸如foreach
之类的常规循环更可取。但是,在其下的map
只是另一个循环。 :)
没有use strict; use warnings;
,切勿运行代码。如果有,您将得到此致命错误:
Global symbol "%person_data" requires explicit package name at -e line 1.
Execution of -e aborted due to compilation errors.
在此代码中,您缺少箭头运算符,当哈希在标量值内时使用该运算符,就像在代码中一样。换句话说:
$person_data{'company'}
应该是这样
$person_data->{'company'}
前者指的是应该这样声明的哈希值:
my %person_data;
如果您使用过strict
,将会避免此问题。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。