2014-01-28 185 views
0

我正在寫一個使用其他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()這樣做,但它不起作用(如here)。

那麼實現該目標的最快方法是什麼?

+3

'系統'不會增加可測量的開銷。你能否用「最快」的方式更好地解釋你的意思? – Zaid

+0

在perl已經足夠快的地方(即:沒有嵌入),使用'system()'不會減慢外部腳本的速度(除非你真的*內存/文件描述符/等)。 –

+0

你想同時運行多個東西嗎? – Zaid

回答

0

你需要讓你的測試腳本定義一個子程序來執行你想運行的所有東西,然後讓你的主腳本讀取測試腳本的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所說,正確的做法是將測試腳本轉換爲module。 如果您將創建比這兩個更多的測試腳本文件,或者如果您想在各個位置安裝腳本,這將是值得的。

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來執行並行執行。

+0

如果您擔心CPU週期,那麼您還應該避免分離第二個'perl'。 – reinierpost