perl - 使用内联哈希定义Perl while()=每个{}循环

标签 perl

我试图在每个循环中定义一个内联哈希,我的程序没有引发任何错误,但是也没有执行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" } }

虽然这解决了一个问题,但是却揭示了另一个问题:您会遇到无尽的循环。
eachkeysvalues使用的迭代器与哈希关联,而不与运算符关联。由于您每次都要在循环中创建一个新的哈希,因此您每次都要在循环中创建一个新的迭代器,因此您将始终获得新创建的哈希的第一个元素,并且循环将永远不会结束。

由于您无需按键查找项目,因此我根本看不到为什么要使用哈希。您可以改用以下内容:
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/

相关文章:

arrays - 2个哈希数组之间的算术运算

perl - 如果 key 不存在,Perl 中的哈希会添加 key

perl - 如何将自定义模块分发添加到本地 CPAN 镜像?

perl - 比较两个文件时,如何跳过(忽略)空行?

perl - 重构 perl sub 以提高可测试性

perl - Perl 最佳实践是否允许在字符串中包含方法名称?

perl - 在perl中异步写入文件

python - Perl Inline::Python 模块,如何将代码放入字符串中

perl - perl 中有什么好的收集模块吗?

regex - Perl 正则表达式语法错误