Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.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
递归调用当前perl脚本并将结果推送到数组_Perl_Recursion - Fatal编程技术网

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

递归调用当前perl脚本并将结果推送到数组,perl,recursion,Perl,Recursion,我有一个perl脚本,它接受1个参数,将结果存储在数组中,然后转到数组中的元素,用数组中的元素作为参数调用自己,并将新结果推送到数组中。由于某种原因,我无法让它工作,阵列也没有改变 我有点像: #some code here that stores result in @result foreach $i (@result){ push(@result, `perl ./myperlscript.pl "$i"`); } 我怎样才能让它工作?还有一种递归调用myperlscript.p

我有一个perl脚本,它接受1个参数,将结果存储在数组中,然后转到数组中的元素,用数组中的元素作为参数调用自己,并将新结果推送到数组中。由于某种原因,我无法让它工作,阵列也没有改变

我有点像:

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

我怎样才能让它工作?还有一种递归调用myperlscript.pl的方法比这更好吗?

如果您正在编写一个调用自身的脚本,您可能会面临设计问题。尝试将主逻辑放入子例程并调用它。这使您能够更好地控制,而且更安全,因为没有外壳逃逸

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

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);
}
#无限循环!耶!
对于(我的$i=0;$i<@array;$i++){
按@数组,函数($i);
}

如果您无法重建脚本,并且必须让它自己调用,那么您应该通过管道传递参数,而不是将它们放在同一行上。好处包括无限长的数据和更高的安全性(无外壳溢出!)。试想一下,诸如“代码> X”、“T”、“MyPutoFrase</代码>”这样的畸形数据会发生什么。这是无害的。但是,还是要声明一个子例程,而不是它。

如果您正在编写一个调用自身的脚本,您可能会面临设计问题。尝试将主逻辑放入子例程并调用它。这使您能够更好地控制,而且更安全,因为没有外壳逃逸

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

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);
}
#无限循环!耶!
对于(我的$i=0;$i<@array;$i++){
按@数组,函数($i);
}

如果您无法重建脚本,并且必须让它自己调用,那么您应该通过管道传递参数,而不是将它们放在同一行上。好处包括无限长的数据和更高的安全性(无外壳溢出!)。试想一下,诸如“代码> X”、“T”、“MyPutoFrase</代码>”这样的畸形数据会发生什么。这是无害的。但是,还是要声明一个子例程,而不是它。

Perl不是shell,通常最好避免使用backtick操作符和system()函数,除非没有其他选项,或者您故意进行了快速的恶意攻击

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


不过,让我们讨论一下你到底在做什么

您的backtick调用正常:

`perl ./myperlscript.pl "$i"`
。。。并将返回该进程放入stdout的任何内容。因此,您的程序必须打印到标准输出

在Perl中,向正在迭代的列表中添加项确实会导致迭代继续

push (@arr,10);
foreach $i (@arr) {
   print "$i\n";
   if($i > 0) {
      push(@arr,$i-1);
   }
}
。。。打印从10到0的倒计时。因此,您的代码有潜力发挥作用。然而,我认为这是一个令人困惑的模式,不是一个好习惯。修改正在循环的数据结构通常被认为是不好的做法

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


请注意,在backtick调用中对@result数组发生的任何事情都不会对当前进程中的@result数组产生影响。它们彼此是不可见的。

Perl不是shell,通常最好避免使用backtick运算符和system()函数,除非没有其他选项,或者您有意进行快速的“肮脏”黑客攻击

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


不过,让我们讨论一下你到底在做什么

您的backtick调用正常:

`perl ./myperlscript.pl "$i"`
。。。并将返回该进程放入stdout的任何内容。因此,您的程序必须打印到标准输出

在Perl中,向正在迭代的列表中添加项确实会导致迭代继续

push (@arr,10);
foreach $i (@arr) {
   print "$i\n";
   if($i > 0) {
      push(@arr,$i-1);
   }
}
。。。打印从10到0的倒计时。因此,您的代码有潜力发挥作用。然而,我认为这是一个令人困惑的模式,不是一个好习惯。修改正在循环的数据结构通常被认为是不好的做法

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


请注意,在backtick调用中对@result数组发生的任何事情都不会对当前进程中的@result数组产生影响。它们彼此看不见。

听起来像是一个可怕的黑客。如果它在同一个脚本中,为什么不使用子例程而不是通过shell调用它自己呢?我实际上是perl新手,所以我仍然在尝试普通脚本。当然,如果不可能,我将不得不编写一个子例程。您实际上没有向我们展示脚本中填充数组和输出数据的部分,因此无法调试此问题。(一个递归调用自己的脚本,虽然很有趣,但可能不是解决任何问题的正确方法。我希望您只是“因为您可以”这样做,而不是针对任何实际应用程序。)请展示实际代码。您所展示的示例未将任何内容打印到stdout,因此只会将空字符串推送到堆栈上。子例程不是最后的选择。递归调用脚本可能是解决任何问题的错误方法听起来像是一种可怕的黑客行为。如果它在同一个脚本中,为什么不使用子例程而不是通过shell调用它自己呢?我实际上是perl新手,所以我仍然在尝试普通脚本。当然,如果不可能的话,我将不得不编写一个子例程。您实际上还没有向我们展示脚本中填充数组和输出数据的部分,因此无法调试它