Perl:从Perl脚本中运行Perl脚本的最快方法是什么?

Perl:从Perl脚本中运行Perl脚本的最快方法是什么?,perl,Perl,我正在编写一个使用其他Perl脚本(不是我的)的Perl脚本。其中一些接收带有标志的输入,而另一些没有。我需要的另一件事是将这些脚本的输出重定向到不同的文件。例如: W\O flags: script1.pl arg1 arg2 arg3 > output1.log W flags: script2.pl -a 1 -b 2 -c 3 > output2.log 底线-我使用system()来完成这项工作,但后来我发现脚本花费的时间太长。 我试着用do()来做这件事,但没有成功(

我正在编写一个使用其他Perl脚本(不是我的)的Perl脚本。其中一些接收带有标志的输入,而另一些没有。我需要的另一件事是将这些脚本的输出重定向到不同的文件。例如:

W\O flags: script1.pl arg1 arg2 arg3 > output1.log

W flags: script2.pl -a 1 -b 2 -c 3 > output2.log
底线-我使用
system()
来完成这项工作,但后来我发现脚本花费的时间太长。 我试着用
do()
来做这件事,但没有成功(比如)


那么实现这一点的最快方法是什么呢?

使用多参数系统调用:

这不会执行shell,您可以节省一些CPU周期

system(qw(script1.pl arg1 arg2 arg3 > output1.log));
作为优化,可能无法调用中指定的命令shell $ENV{PERL5SHELL}.system(1,@args)生成一个外部进程并 立即返回其进程指示符,而无需等待它返回 终止。”


如果您对返回状态不感兴趣,可以使用exec,也可以使用fork/thread并行执行。

您需要让测试脚本定义一个子例程,该子例程执行您想要运行的所有内容,然后让主脚本读取测试脚本的Perl代码并调用该子例程-因此测试脚本将如下所示:

#!/usr/bin/env perl
#
# defines how to run a test

use strict;
use warnings;

sub test
{
    my ($arg1, $arg2, $arg3) = @_;
    # run the test
    (...)
)
主脚本:

#!/usr/bin/env perl
#
# runs all of the tests

use strict;
use warnings;

require 'testdef.pl';  # the other script

foreach (...)
{
    (...)
    test($arg1, $arg2, $arg3);
}
这仍然是一种非常基本的方法。 正如ikegami所说,正确的方法是将测试脚本转换为一个脚本。
如果您创建的测试脚本文件多于这两个,或者您希望在不同的位置安装脚本,那么这将是值得的。

system
不会增加可测量的开销。你能更好地解释一下你所说的“最快”方式是什么意思吗?在perl已经足够快(即:不嵌入)的任何地方,使用
system()
不会减慢外部脚本的速度(除非你的内存/文件描述符/etc真的很低)。你想同时运行多个东西吗?@Zaid,它不需要重新编译所有东西,所以这可能需要几秒钟的时间。@user1953271、
system
do
不是一回事。你不能一个换另一个。事实上,
doexpr
根本没有意义。如果您想在与第一个脚本相同的解释器中执行第二个脚本,请将其放入一个模块中。如果您担心CPU周期,还需要避免分叉第二个
perl