【问题标题】:Perl equivalent of Python for loop?Perl 相当于 Python for 循环?
【发布时间】:2021-10-08 00:12:29
【问题描述】:

是否有与以下 Python 代码等效的 Perl?

names['name'] = ['Bob', 'Bill', 'Terry']
obj = {'Students': [ {'Names': name} for name in names['name']]}

这最终会看起来像这样

编辑: 正如 Tim Roberts 指出的那样:结果应该是这样的

[ {'Names': "Bob" }, { "Names": "Bill" },. { "Names": "Terry" } ]

我见过 Perl one 做不同的事情,但不是这个。

【问题讨论】:

  • 您的 Python 所做的事情与预期的结果大不相同。
  • 等一下,这是一个有用的结果,但这不是您的代码会产生的结果。你会产生一个完整的列表字典,每个字典都有一个元素:[ {'Names': "Bob" }, { "Names": "Bill" },. { "Names": "Terry" } ]
  • 请显示完整的输入、工作代码和预期输出,以及您的翻译尝试。你被困在哪里了?如果您使用 Python,请正确标注。 objarr 不是你想象的那样。我推荐arr => dctobj => result_dct 或类似的东西。

标签: python perl


【解决方案1】:

您希望 a map 在您的数据结构中。它不是单行的。这只是普通的代码。

my $obj = {
  'Students' => [
    map { 'Names' => $_ }, @{ $names{name} }
  ]
};

我使用了表达式形式 map (map EXPR, LIST),在要评估的表达式后面加上逗号 (,)。花括号 ({}) 是哈希引用构造函数。或者,您可以使用块形式 (map BLOCK LIST),它会有一对额外的花括号。

    map { { 'Names' => $_  } } @{ $names{name} }

如果你想要一个普通的哈希而不是引用,像这样替换。

my %obj = (
# ...
);

【讨论】:

  • 请注意,arr 在 Perl 中是一个哈希,因为它是关联的——就像它在 Python 中作为一个字典一样。
  • 不确定 OP 是否会关心这种区别,但也有 my %obj = ( ... ) 而不是 my $obj = { ... },具体取决于您想要哈希还是哈希引用。
  • $arr{name} 是一个标量。要将正确的 LIST 传递给 map,请使用 @{$arr{name}}
  • “注意 arr 将是 Perl 中的哈希”:问题可能已被编辑,现在不再提及 arr.. 所以这个答案令人困惑
  • arr 更改为 names 以匹配 OP 中的更改
【解决方案2】:

这是另一种方法:

use Data::Dumper;
my @names = ('Bob', 'Bill', 'Terry');

my %out_dict;

my @students_dict = ();
foreach my $name (@names) {
    push(@students_dict, {'Names' => $name});
}

$out_dict{'Students'} = \@students_dict;
print Dumper \%out_dict;

输出:

$VAR1 = {
          'Students' => [
                          {
                            'Names' => 'Bob'
                          },
                          {
                            'Names' => 'Bill'
                          },
                          {
                            'Names' => 'Terry'
                          }
                        ]
        };

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-02-20
    • 1970-01-01
    • 1970-01-01
    • 2013-06-29
    • 2021-04-02
    • 1970-01-01
    • 2011-12-12
    • 1970-01-01
    相关资源
    最近更新 更多