最近,我有一個perl腳本使用「do」調用另一個perl腳本;即。在Perl中的「做」功能
do "./script2.pl $arg1 $arg2";
我script2.pl旨在消耗2個參數。
但是,以上述方式調用script2.pl不會將參數傳遞到script2.pl中。
我知道有另一種使用「系統」的方法,但我的script1.pl需要通過「require」來獲取一些變量值。
我真的可以使用「do」並將參數傳遞給我的script2嗎?
最近,我有一個perl腳本使用「do」調用另一個perl腳本;即。在Perl中的「做」功能
do "./script2.pl $arg1 $arg2";
我script2.pl旨在消耗2個參數。
但是,以上述方式調用script2.pl不會將參數傳遞到script2.pl中。
我知道有另一種使用「系統」的方法,但我的script1.pl需要通過「require」來獲取一些變量值。
我真的可以使用「do」並將參數傳遞給我的script2嗎?
如果您正在調用的腳本正在等待參數,則它將在變量@ARGV
中預期它們。如果您使用的是do
,調用腳本中的@ARGV
將在被調用的腳本中可見。
{
local @ARGV = ($arg1, $arg2);
do './script2.pl';
}
使用local
這樣將在塊結束恢復@ARGV
舊值,有點像說
@ARGV_old = @ARGV;
@ARGV = ($arg1,$arg2);
do './script2.pl';
@ARGV = @ARGV_old;
如果你想共享變量,那麼它們應該在同一個模塊中。否則,你正在寫意大利麪條。
如果你想構建你的代碼,以便一個文件封裝一些函數,然後把它作爲一個模塊,並有「使用模塊」來包含它。
script2是一個非常長的腳本,它被設計用來完成一些其他的工作,並且許多其他人正在使用這個腳本; script1是由我寫的,我只是想在script2中獲得一些變量的值。我無法修改該腳本2。謝謝。 –
不,您不能將參數傳遞給do
的perl腳本。
謝謝。那麼我能以什麼方式來解決這個問題? –
簡短的回答,是你可能想使用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
通過要求,這些變量將被設置加載。這仍然不是最好的方法。
更好的是,使用包來共享代碼,但這將超出問題的範圍。
您還可以
eval `cat ./script2.pl`
注入腳本主程序
這樣它可以訪問主程序的所有範圍變量。
您應該澄清「需要通過require獲取某些變量值」的含義。顯示代碼。 – TLP
難道你不是指「我想要@ARGV中的參數嗎?」在這種情況下,你爲什麼不把它們放在@ARGV中? – ikegami