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

时间:2014-01-28 13:28:52

标签: 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()执行此操作,但它不起作用(如here)。

那么实现这一目标的最快方法是什么?

2 个答案:

答案 0 :(得分:0)

使用多参数系统调用:http://perldoc.perl.org/functions/system.html

这不会执行shell,你可以节省几个CPU周期

system(qw(script1.pl arg1 arg2 arg3 > output1.log));
  

“作为优化,可能无法调用指定的命令shell   $ ENV {PERL5SHELL}。 system(1,@ args)产生一个外部进程和   立即返回其进程指示符,而不是等待它   终止。 “

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

答案 1 :(得分:0)

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

#!/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所说,正确的方法是将测试脚本变成module。 如果你要创建的测试脚本文件不仅仅是这两个,或者你想在不同的位置安装脚本,那将是值得的。