Yaml输入perl永恒循环问题

时间:2013-05-10 23:40:15

标签: 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 } ) {
    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(我的($ key,$ value)=每个%{$ _})”在主代码中永远运行,一遍又一遍地使用相同的键和值。

2 个答案:

答案 0 :(得分:1)

呀。不要那样做。

在循环时不要修改哈希。来自perldoc -f each

  

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

一般模式是建立修改列表,然后在循环结束后创建它们。当然,您可以将该序列嵌入到循环中,该循环遍历散列,直到不再需要进行修改为止。

答案 1 :(得分:1)

您的代码重构工作正常。我重写了process以完成最内层哈希所需的所有操作。我将这些$item命名为我不知道他们应该代表什么。请将其修改为更具描述性的内容。

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

检查$key的每个元素,并根据需要从$itemfunction1获取要为该元素添加的新数据哈希,并将其推送到function2而不是直接插入。

一旦建立了所有新值,它们都会被添加到@params中,并且流程已完成。

$item