0

VMware vSphere perl API を呼び出す perl スクリプトに取り組んでいます。私はほとんど問題に直面していませんでしたが、グーグルで調べていると、うまくいくと思われる解決策が見つかりました。ただし、コードの重要な部分の 1 つはmap. クレジットは、それを書いた VMware コミュニティ メンバーに与えられます。コードは次のとおりです。

$datastore_map = map { $_->{'mo_ref'}->{'value'} => $_  } @{$datastore_views || [ ]};

上記の行が何をしているのか理解できません。

では、上記の行を foreach ループなどに変換するのを手伝っていただけませんか。TMTOWTDI を信じると、同じロジックを記述する別の方法が必要になります。

何度も機能を学ぼうとしましmapたが、いつも頭から離れます。したがって、関数を使用せずに上記のロジックを実装したいと考えていmapます。

編集:

%datastore_map答えを読んだ後、それはすべきであり、すべきではないと思います$datastore_map。コードの次の行は$datastore = $datastore_map->{$moref->{'value'}};

タイプミスに違いありません。

stacoverflow で許可されたら、回答を受け入れます。迅速な対応ありがとうございます。私はそれを理解しようとしてほぼ1時間費やしましたが、失敗しました。

ありがとう。

編集:

@nickisfat、@choroba、@ikegami の回答に感謝します。すべての答えは正しいですが、受け入れることができるのは 1 つだけです。なので、時系列で最初に投稿されたものでいきます。回答ありがとうございます。

4

3 に答える 3

4
map BLOCK LIST

と非常によく似ています

do {
   my @list;
   for (LIST) {
      push @list, do BLOCK;
   }
   @list
};

あなたが投稿したコードは意味がありません。割り当ての LHS が実際にはハッシュであったか、カーリーのセットが欠落しています。あなたのコードが実際に

my $datastore_map = {
    map { $_->{'mo_ref'}->{'value'} => $_ }
     @{ $datastore_views || [ ] }
};

始める前に、これを次のように書き直して、物事を少し簡単にしましょう。

my %datastore_map =
    map { $_->{'mo_ref'}->{'value'} => $_ }
     @{ $datastore_views || [ ] };

my $datastore_map = \%datastore_map;

つまり、あなたが持っているものは同等です

my %datastore_map = do {
   my @list;
   for (@{ $datastore_views || [ ] }) {
      push @list, do { $_->{'mo_ref'}->{'value'} => $_ };
   }
   @list
};      

my $datastore_map = \%datastore_map;

そして、それを次のように単純化できます

my %datastore_map;
for (@{ $datastore_views || [ ] }) {
   $datastore_map{ $_->{'mo_ref'}->{'value'} } = $_;
}      

my $datastore_map = \%datastore_map;

また

my %datastore_map;
if ($datastore_views) {
   for (@$datastore_views) {
      $datastore_map{ $_->{'mo_ref'}->{'value'} } = $_;
   }
}      

my $datastore_map = \%datastore_map;
于 2012-11-01T09:56:27.267 に答える
1

$ datastore_viewsはハッシュを含む配列であり、コードは{'mo_ref'}-> {'value'}の内容をキーとするハッシュ($ datastore_map)のハッシュを作成します。

Foreachで:

foreach my $item( @$datastore_views ){
    $datastore_map->{ $item->{'mo_ref'}->{'value'} } = $item;
}

編集:

または、少なくとも、元のコードが次の場合に実行されることです。

%$datastore_map = map { $_->{'mo_ref'}->{'value'} => $_  } @{$datastore_views || [ ]};
于 2012-11-01T09:52:39.957 に答える
1

結果をスカラーに代入しますか?

そうでない場合は、次を使用してください。

my %datastore_map;
for my $view (@$datastore_views) {
    $datastore_map{$view->{mo_ref}{value}} = $view;
}

はいの場合、ビュー数の 2 倍を取得する必要があります。したがって、単純に使用します。

$datastore_map = 2 * @$datastore_views;

しかし、そのような場合、変数の名前の選択は不適切です。

于 2012-11-01T09:50:58.037 に答える