我试图在每个循环中定义一个内联哈希,我的程序没有引发任何错误,但是也没有执行print语句。是否可以定义内联哈希,如下所示:
while (my (key, value) = each %{ (apple => "red", orange => "orange", grape => "purple")}) {
print "something";
}
或者,如果我直接在每个返回散列的语句中调用一个子程序,如下所示,我将无法使每个循环正常工作:
sub returnsHash {
my %fruits = (
apple => "red",
orange => "orange",
grape => "purple",
);
return %fruits;
}
while (my (key, value) = each %{ returnsHash() }) {
print "something";
}
最佳答案
标量上下文中的列表/逗号运算符将求出标量上下文中最后一项的结果。那意味着
each %{ apple => "red", orange => "orange", grape => "purple" }
相当于
each %{ "purple" }
这是您的两个摘要都在执行的操作,但这是不希望的,并且是严格的违反。 (始终使用
use strict; use warnings qw( all );
!!!)您正在使用哈希取消引用(
%{ ... }
),但是没有哈希,更不用说对可以取消引用的哈希的引用。要构建哈希并返回对该哈希的引用,请使用{ ... }
。each %{ { apple => "red", orange => "orange", grape => "purple" } }
虽然这解决了一个问题,但是却揭示了另一个问题:您会遇到无尽的循环。
each
,keys
和values
使用的迭代器与哈希关联,而不与运算符关联。由于您每次都要在循环中创建一个新的哈希,因此您每次都要在循环中创建一个新的迭代器,因此您将始终获得新创建的哈希的第一个元素,并且循环将永远不会结束。由于您无需按键查找项目,因此我根本看不到为什么要使用哈希。您可以改用以下内容:
for (
[ apple => "red" ],
[ orange => "orange" ],
[ grape => "purple" ],
) {
my ($key, $val) = @$_;
...
}
如果您从子列表中获取列表,则以下是编写以上内容的方法。
use List::Util qw( pairs );
for (pairs(f())) {
my ($key, $val) = @$_;
...
}
但是,这两个都创建了许多数组。由于没有破坏力的问题,因此我将使用以下方法避免发生该问题:
{
my @kvs = f();
while ( my ($key, $val) = splice(@kvs, 0, 2) ) {
...
}
}
您还可以使用以下内容,但我认为很多人会对此感到困惑:
for (
my @kvs = f();
my ($key, $val) = splice(@kvs, 0, 2);
) {
...
}
关于perl - 使用内联哈希定义Perl while()=每个{}循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50884169/