Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Yaml输入perl永久循环问题_Perl - Fatal编程技术网

Yaml输入perl永久循环问题

Yaml输入perl永久循环问题,perl,Perl,$description是从格式为的yaml文件输入的 main_key: - key1:value2 key2:value2 - key1:value1 key2:value2 基本上,这是散列数组的散列 我输入$description并按如下方式处理内部哈希: while ( my ( $mod, $defined ) = each %{ $description } ) { my $index = 0; foreach ( @{ $defined } )

$description是从格式为的yaml文件输入的

main_key:
 -
  key1:value2
  key2:value2
 -
  key1:value1
  key2:value2
基本上,这是散列数组的散列

我输入$description并按如下方式处理内部哈希:

while (  my ( $mod, $defined )  = each %{ $description } ) {
  my $index = 0;
  foreach ( @{ $defined } ) {
    while ( my ( $key, $value )  = each %{ $_ } ) {
         process ( $key, $mod, $description, $index );
    }
  $index = $index + 1;
  }
}
当某个“关键字”被用作键时,我会将更多的键、值对添加到内部哈希中 function1()和function2()返回哈希指针

sub process {
      my ( $key, $mod, $description, $index ) = @_; 
      my $parameters;
      if ( $key eq 'keyword' ) {
             $parameters = function1( );
      }
      else {
             $parameters = function2( );
      }
      $description->{$mod}[$index] = { %$parameters, %{$description->{$mod}[$index]} };
}
这里的问题是主代码中的“while(my($key,$value)=each%{$\u})”永远运行,反复使用相同的键和值

是的。不要那样做

在循环时不要修改散列。发件人:

如果在对哈希进行迭代时添加或删除哈希的元素, 条目可能被跳过或复制,所以不要这样做


一般模式是建立修改列表,然后在循环结束后进行修改。当然,您可以将该序列嵌入到一个外部循环中,该循环在散列上迭代,直到不再需要进行修改。

这种代码重构工作正常。我已经重写了
过程
,以完成最内部哈希所需的所有操作。我给这些
$item
命名,因为我不知道它们应该代表什么。请将此修改为更具描述性的内容

从来没有任何理由传递所有这些参数,因为
$description
$mod
$index
的值只用于使用
$description->{$mod}[$index]
来定位所讨论的哈希,所以它也可以作为引用直接传递,这就是我所做的。此外,由于
process
现在在数组内容上循环,因此也不需要传递
$key
,因此子例程现在只有一个参数

检查
$item
的每个元素,并根据需要从
function1
function2
获取要为该元素添加的新数据散列,并将其推到
@params
上,而不是直接插入

一旦建立了所有新值,它们将全部添加到
$item
中,并且该过程完成

for my $defined (values %$description) {
  process($_) for @$defined;
}

sub process {
  my ($item) = @_;
  my @params;

  for my $key (keys %$item) {
    push @params, $key eq 'keyword' ? function1() : function2();
  }

  for my $params (@params) {
    @{$item}{keys %$params} = values %{$params};
  }
}

不过,我确实复制了一份散列,并尝试修改该副本。同样的结果。我检查以确保哈希引用指向单独的内存。基本上我通过了$description\u副本(指向不同的mem和流程函数的原始描述副本,感谢您的关注。我需要一些时间将其集成到我的代码中,并将返回给您。这里的主要区别似乎是流程在哈希级别进行修改,而不是一次向流程传递单个键。我们您仍在修改哈希“说明”是的,
$description
的内容正在被修改。数组散列中的每一个散列都通过引用传递到被修改的
进程中。主要区别在于所需的修改在
@params
中累积,并在子例程检查了所有的键。这与您的代码不同,您的代码在检查每个键时添加了新元素,从而导致无限循环。