$ 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)=每个%{$ _})”在主代码中永远运行,一遍又一遍地使用相同的键和值。
答案 0 :(得分:1)
呀。不要那样做。
在循环时不要修改哈希。来自perldoc -f each:
如果在迭代时添加或删除哈希的元素, 条目可能会被跳过或重复 - 所以不要这样做。
一般模式是建立修改列表,然后在循环结束后创建它们。当然,您可以将该序列嵌入到循环中,该循环遍历散列,直到不再需要进行修改为止。
答案 1 :(得分:1)
您的代码重构工作正常。我重写了process
以完成最内层哈希所需的所有操作。我将这些$item
命名为我不知道他们应该代表什么。请将其修改为更具描述性的内容。
从来没有任何理由传递所有这些参数,因为$description
,$mod
和$index
的值仅用于使用{{1}定位相关哈希值所以它也可以直接作为参考传递,这就是我所做的。另外,因为$description->{$mod}[$index]
现在遍历数组内容,所以也不需要传递process
,所以子例程现在只有一个参数。
检查$key
的每个元素,并根据需要从$item
或function1
获取要为该元素添加的新数据哈希,并将其推送到function2
而不是直接插入。
一旦建立了所有新值,它们都会被添加到@params
中,并且流程已完成。
$item