【问题标题】:Perl: autovivification doesn't create array in hashPerl:自动生存不会在哈希中创建数组
【发布时间】:2016-02-02 05:33:31
【问题描述】:

我有一段 perl 脚本:

my $thread_count = 20

my %QUEUES;
my $current_queue=0;

while(defined($INPUT[$cnt]))
{
        while (my @instance = $q1->fetchrow_array)
        {
                my $walk = "string";
                push @{$QUEUES{$current_queue}},$walk;
                $current_queue=($current_queue+1)%$thread_count;
        }

        while (my @instance = $q2->fetchrow_array) {
                my $walk = "string";
                push @{$QUEUES{$current_queue}},$walk;
                $current_queue=($current_queue+1)%$thread_count;
        }
}

我试图将命令推送到一个数组中,我决定将其保存在一个散列中,因为我认为我可以让我的生活变得轻松而不是 if(!defined($QUEUES[$current_queue]))$QUEUES[$current_queue]=[];

我使用了Data::Dumper 和一个常规的 for 循环,发现没有为 $QUEUE 中的任何键定义任何内容,从 0 到 $thread_count-1。这不是教科书自动复活的用法吗?我做错了什么?

【问题讨论】:

  • 该代码不会运行。您为什么不创建一个minimal reproducible example 来显示您遇到的相同问题?
  • 我也不确定您认为($current_queue+1)%$thread_count 应该发生什么...
  • @MattJacob: $current_queue=($current_queue+1)%$thread_count; 以 $thread_count 为模递增一个 $current_queue。那里肯定没有什么奇怪的,不是吗?也就是说,我无法重现所描述的问题,因此我投票决定将这个问题搁置,直到提供一个展示不良行为的实际示例。
  • (另外,我不确定为什么 OP 将 %QUEUES 定义为哈希,然后用 0 到 19 的整数对其进行索引。当然数组会更好?但在至少这不应该以任何方式影响自动激活行为。)
  • 如果您使用线程,请务必查看the DBI docs on threads。否则我怀疑您的查询没有返回任何内容,因此循环永远不会运行。在 while 循环中放置一个打印或增加一个计数器以找出答案。

标签: arrays perl autovivification


【解决方案1】:
push @{ $QUEUES{$current_queue} }, $walk;

等价于

push @{ $QUEUES{$current_queue} //= [] }, $walk;

如果在 $QUEUES{$current_queue} 不存在时执行该语句,则将创建 $QUEUES{$current_queue},并为其分配一个对具有一个元素的数组的引用($walk 的副本)。

因此,如果 %QUEUES 为空,则永远不会执行 push 语句。

【讨论】:

  • 抱歉耽搁了这么久。感谢您富有洞察力的回答。经过一番调查,事实证明循环实际上从未执行过,因为fetchrow_array 从未返回任何内容。我仍然不知道为什么,或者我能做些什么。不过,您的回答非常有帮助。谢谢。
猜你喜欢
  • 2011-04-20
  • 2011-05-08
  • 2014-04-13
  • 1970-01-01
  • 2013-12-20
  • 2018-08-26
  • 1970-01-01
  • 2023-03-14
  • 1970-01-01
相关资源
最近更新 更多