Perl 相当于 Python for 循环?
Posted
技术标签:
【中文标题】Perl 相当于 Python for 循环?【英文标题】:Perl equivalent of Python for loop? 【发布时间】: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,请正确标注。 obj
和 arr
不是你想象的那样。我推荐arr
=> dct
和obj
=> result_dct
或类似的东西。
【参考方案1】:
您希望 a map
在您的数据结构中。它不是单行的。这只是普通的代码。
my $obj =
'Students' => [
map 'Names' => $_ , @ $namesname
]
;
我使用了表达式形式 map
(map EXPR, LIST
),在要评估的表达式后面加上逗号 (,
)。花括号 () 是哈希引用构造函数。或者,您可以使用块形式 (
map BLOCK LIST
),它会有一对额外的花括号。
map 'Names' => $_ @ $namesname
如果你想要一个普通的哈希而不是引用,像这样替换。
my %obj = (
# ...
);
【讨论】:
请注意,arr
在 Perl 中是一个哈希,因为它是关联的——就像它在 Python 中作为一个字典一样。
不确定 OP 是否会关心这种区别,但也有 my %obj = ( ... )
而不是 my $obj = ...
,具体取决于您想要哈希还是哈希引用。
$arrname
是一个标量。要将正确的 LIST 传递给 map
,请使用 @$arrname
。
“注意 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'
]
;
【讨论】:
以上是关于Perl 相当于 Python for 循环?的主要内容,如果未能解决你的问题,请参考以下文章