我正在编写一个使用其他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)。
那么实现这一目标的最快方法是什么?
答案 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。 如果你要创建的测试脚本文件不仅仅是这两个,或者你想在不同的位置安装脚本,那将是值得的。