私はある種のperlハッシュマップを持っています
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()]
Pythonリスト内包表記に相当するPerlは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
ここでは、あなたが示したjsonに相当する有効なPerlハッシュを使用しました。必要に応じて一重引用符を使用しました。これは、変数の補間が不要な場所です。
values %name_to_contact
:入力ハッシュの値の順序付けられていないリスト、つまり匿名ハッシュのリストを返します。
map { $_->{company} } values %name_to_contact
:入力ハッシュの値のリストを取得し、各要素(匿名ハッシュ)に対してそれをに割り当て$_
ます。この匿名ハッシュのキー$_->{company}
の値ですcompany
。それでおしまい!
map
1つのステートメントで複数の呼び出しを連鎖させることができることに注意してください。これは強力な構造であり、などの通常のループよりも望ましい場合がよくありますforeach
。ただし、その下にあるamap
は単なる別のループです。:)
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加