2012-06-24 34 views
1

最近,我有一個perl腳本使用「do」調用另一個perl腳本;即。在Perl中的「做」功能

do "./script2.pl $arg1 $arg2";

我script2.pl旨在消耗2個參數。

但是,以上述方式調用script2.pl不會將參數傳遞到script2.pl中。

我知道有另一種使用「系統」的方法,但我的script1.pl需要通過「require」來獲取一些變量值。

我真的可以使用「do」並將參數傳遞給我的script2嗎?

+0

您應該澄清「需要通過require獲取某些變量值」的含義。顯示代碼。 – TLP

+0

難道你不是指「我想要@ARGV中的參數嗎?」在這種情況下,你爲什麼不把它們放在@ARGV中? – ikegami

回答

10

如果您正在調用的腳本正在等待參數,則它將在變量@ARGV中預期它們。如果您使用的是do,調用腳本中的@ARGV將在被調用的腳本中可見。

{ 
    local @ARGV = ($arg1, $arg2); 
    do './script2.pl'; 
} 

使用local這樣將在塊結束恢復@ARGV舊值,有點像說

@ARGV_old = @ARGV; 
@ARGV = ($arg1,$arg2); 
do './script2.pl'; 
@ARGV = @ARGV_old; 
0

如果你想共享變量,那麼它們應該在同一個模塊中。否則,你正在寫意大利麪條。

如果你想構建你的代碼,以便一個文件封裝一些函數,然後把它作爲一個模塊,並有「使用模塊」來包含它。

+0

script2是一個非常長的腳本,它被設計用來完成一些其他的工作,並且許多其他人正在使用這個腳本; script1是由我寫的,我只是想在script2中獲得一些變量的值。我無法修改該腳本2。謝謝。 –

-1

不,您不能將參數傳遞給do的perl腳本。

+0

謝謝。那麼我能以什麼方式來解決這個問題? –

3

簡短的回答,是你可能想使用system()如果你想調用另一個腳本參數:

use autodie; 
system('./script2.pl', $arg1, $arg2); 

# OR if you don't want to install autodie from CPAN 
system('./script2.pl', $arg1, $arg2) == 0 
    or die "cannot run script2.pl: $!"; 

如果您需要共享一個解釋,你可能想這樣做完全不同。例如,對於快速腳本,我有時用require這樣的:

our $SHARED_VALUE = 0; 
our $OTHER_VALUE = 42; 

require 'script2.pl'; 

script2.pl,您可以定義:

our ($SHARED_VALUE, $OTHER_VALUE); 

script2.pl通過要求,這些變量將被設置加載。這仍然不是最好的方法。

更好的是,使用包來共享代碼,但這將超出問題的範圍。

+1

'autodie'是perl v5.10.1的核心模塊。 – TLP

+1

好點。另一方面,由於某些原因,大多數人仍然使用12至15年前發佈的5.8版本的Perl,因此您仍然需要指出替代方案。 – zostay

+0

兩年前的尺度已經傾向於5.10。 http://imgur.com/lcUvL(來源:Perl Survey 2010) – daxim

0

您還可以

eval `cat ./script2.pl` 
注入腳本主程序

這樣它可以訪問主程序的所有範圍變量。