コンパクトかつ(または)迅速な方法でハッシュマップの配列から配列として特定のキーのすべての値を取得する

アモグMK

私はある種の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それでおしまい!


map1つのステートメントで複数の呼び出しを連鎖させることができることに注意してください。これは強力な構造であり、などの通常のループよりも望ましい場合がよくありますforeachただし、その下にあるamapは単なる別のループです。:)

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

Related 関連記事

ホットタグ

アーカイブ