0

我正在编写一个调用 VMware vSphere perl API 的 perl 脚本。我遇到了一些问题,在谷歌搜索时,我找到了一个似乎对我有用的解决方案。但是,代码的重要部分之一是用map. 归功于编写它的 VMware 社区成员。这是代码:

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

我无法理解上面的行在做什么。

所以,你能帮我把上面的行转换成 foreach 循环或类似的东西吗?相信 TMTOWTDI,必须有另一种方法来编写相同的逻辑。

我试图学习这个map功能很多次,但它总是在我脑海中浮现。因此,我想在不使用该map功能的情况下实现上述逻辑。

编辑:

阅读答案后,我认为应该是%datastore_map而不是$datastore_map。因为代码的下一行是$datastore = $datastore_map->{$moref->{'value'}};

它必须是一个错字。

当 stacoverflow 允许时,我会接受答案。感谢您的快速回复。我花了将近一个小时试图理解它并失败了。

谢谢。

编辑:

感谢@nickisfat、@choroba 和@ikegami 的回复。所有答案都是正确的,但我只能接受一个。所以我会选择按时间顺序最先发布的那个。再次感谢您的回答。

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

您确定要将结果赋值给标量吗?

如果没有,只需使用以下内容:

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 回答
1

$datastore_views 是一个包含散列的数组,代码创建这些散列 ($datastore_map) 的散列,以 {'mo_ref'}->{'value'} 的内容为键。

在 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 回答