递归调用当前的perl脚本并将结果推送到数组

时间:2012-08-20 10:38:43

标签: perl recursion

我有一个带有1个参数的perl脚本,将结果存储在数组中,然后转到数组中的元素并使用数组元素作为参数调用自身,并将新结果推送到数组。出于某种原因,我无法让它工作,数组也不会改变。

我有类似的东西:

#some code here that stores result in @result
foreach $i (@result){
    push(@result, `perl ./myperlscript.pl "$i"`);
}

我如何让它工作?有没有办法递归调用myperlscript.pl比这更好?

2 个答案:

答案 0 :(得分:4)

如果您正在编写一个自称的脚本,那么可能面临设计问题。尝试将主逻辑放入子例程并调用它。这样可以提供更多控制并且更安全,因为没有shell转义。

您也不应该修改正在迭代的数组。这可能会更好:

my @tmp = ();
foreach my $i (@array) {
    push @tmp, function($i);
}
push @array, @tmp;

如果你不想进入,你应该使用传统的for循环:

# infinite loop! Yay!
for (my $i = 0; $i < @array; $i++) {
    push @array, function($i);
}

如果你不能重建你的脚本而你必须让它自己调用,你应该管道参数,而不是把它们放在同一行上。好处包括无限长的数据和更高的安全性(没有shell转发!)。只考虑像x" | tee "mySecretFile这样的格式错误的数据可能会发生什么。那是无辜的。但是,再次声明一个子程序而不是那个。

答案 1 :(得分:2)

Perl不是shell,一般情况下,最好避免使用反引号操作符和system()函数,除非没有其他选项,或者你有意识地做了快速的&#39 ; n&#39;脏黑客。

学习编写子程序并以这种方式进行递归。如果你没有掌握子程序,你就不应该处理递归。


但是,让我们讨论一下你正在做什么。

您的反引号调用正常:

`perl ./myperlscript.pl "$i"`

...并将返回该进程向stdout提供的任何内容。因此,您的程序必须打印到标准输出。

在Perl中,将项目添加到正在迭代的列表 会导致迭代继续。

push (@arr,10);
foreach $i (@arr) {
   print "$i\n";
   if($i > 0) {
      push(@arr,$i-1);
   }
}

...打印从10到0的倒计时。因此您的代码有可能发挥作用。但是我认为这是一个令人困惑的模型,并不是一个好习惯。修改您循环的数据结构通常不被视为良好做法。

您的代码显示没有停止状况的证据。当你递归时,你总是需要考虑停止条件。

请注意,在反引号调用中@result数组中发生的任何事情都不会影响当前进程中的@result数组。它们彼此无形。