這是在 perl Windows 中。
代碼片段:
my $TestVarDirName;
my $testScript = "U:/perl.exe U:/devAuto.pl -p SHELL=/usr/bin/bash $TestVarDirName -t lnx64";
&runAndMonitor(\@ForRun, "$MSROO/logs/Test.log");
$testScript = "U:/perl.exe U:/devAuto.pl -p SHELL=/usr/hash -m win -serial 32 $TestVarDirName -t wint"; ### Added
&runAndMonitor(\@ForRun2, "$MSROO/logs/Test2.log"); ### Added
sub runAndMonitor {
my @ForRunPerProduct = @{$_[0]};
my $logFile = $_[1];
foreach my $TestVar (@ForRunPerProduct) {
print "$testScript is the testScript command\n"; ### Line 9
$TestVarDirName = $TestVar;
$TestVarDirName = dirname ($TestVarDirName);
my $filehandle;
if ( !($pid = open( $filehandle, "-|" , " $bashexe -c \"cd $smokesBasePath \; $testScript \" >> $logFile ""))) {
die( "Failed to start process: $!" );
}
}
}
我希望在管道打開命令中,$testScript
變數$TestVarDirName
僅在$testScript
(動態)被呼叫時替換值,而不是在腳本的開頭。
目前,在“第 9 行”(如代碼片段中所述),我得到U:/perl.exe U:/devAuto.pl -p SHELL=/usr/bin/bash -t lnx64 is the testScript command
. 當然,因為最初在腳本開始時,$TestVarDirName
它沒有任何值,并且命令將根據其初始值作業。我怎樣才能避免它,并讓最新的價值$TestVarDirName
被使用?
uj5u.com熱心網友回復:
使用匿名子來構建字串:
my $testScriptBuilder = sub { "U:/perl.exe U:/devAuto.pl -p SHELL=/usr/bin/bash $_[0] -t lnx64" };
...
foreach my $TestVar (@ForRunPerProduct) {
local $TestVarDirName = dirname($TestVar);
my $testScript = $testScriptBuilder->($TestVarDirName);
....
}
如果您認為在字串中使用$_[0]
而不是$TestVarDirName
讓事情變得不那么清晰,那么您可以使用這個 sub 來代替:
my $testScriptBuilder = sub {
my $TestVarDirName = $_[0];
return "U:/perl.exe U:/devAuto.pl -p SHELL=/usr/bin/bash $TestVarDirName -t lnx64"
};
$_[0]
(or $TestVarDirName
) in的插值"U:/perl.exe U:/devAuto.pl -p SHELL=/usr/bin/bash $_[0] -t lnx64"
僅在testScriptBuilder
評估子例程時完成,也就是您實際呼叫它時使用testScriptBuilder->($TestVarDirName)
. 因此,$TestVarDirName
將具有期望值 ( dirname($TestVar)
)。
或者,您可以使用該Template
模塊:
my $testScriptTemplate = "U:/perl.exe U:/devAuto.pl -p SHELL=/usr/bin/bash [% TestVarDirName %] -t lnx64";
...
foreach my $TestVar (@ForRunPerProduct) {
my $TestVarDirName = dirname($TestVar);
Template->new->process(\$testScriptTemplate, { TestVarDirName => $TestVarDirName }, \my $testScript);
...
}
缺點是您必須以更具侵入性的方式修改初始字串(替換$TestVarDirName
為[% TestVarDirName %]
)。然而,這也是一個好處,因為它允許您指定什么應該提前插值,什么不應該:模板字串中的所有變數都將立即插值,而里面的東西[% %]
將稍后插值。
uj5u.com熱心網友回復:
達達的回答是這樣做的理智的方式,但如果你想要一種不那么理智的方式......
use String::Interpolate::Delayed;
my $TestVarDirName;
my $testScript = delayed "U:/perl.exe U:/devAuto.pl -p SHELL=/usr/bin/bash $TestVarDirName -t lnx64";
&runAndMonitor(\@ForRun, "$MSROO/logs/Test.log");
sub runAndMonitor {
my @ForRunPerProduct = @{$_[0]};
my $logFile = $_[1];
foreach my $TestVar (@ForRunPerProduct) {
print "$testScript is the testScript command\n"; ### Line 9
$TestVarDirName = $TestVar;
$TestVarDirName = dirname ($TestVarDirName);
my $filehandle;
if ( !($pid = open( $filehandle, "-|" , " $bashexe -c \"cd $smokesBasePath \; $testScript \" >> $logFile ""))) {
die( "Failed to start process: $!" );
}
}
}
uj5u.com熱心網友回復:
我認為這里有一個更簡單的方法。為您想要的字串設定一個模板,然后在您準備好使用它時填寫占位符。沒有花哨的子程式技巧或模塊:
my $testScript_template = "U:/perl.exe ... %s -t lnx64";
sub runAndMonitor {
...
foreach my $TestVar (@ForRunPerProduct) {
...
$TestVarDirName = dirname ($TestVarDirName);
$testScript = sprintf $testScript_template, $TestVarDirName;
...
}
}
但我可能會將該模板移動到它需要的最小范圍內:
sub runAndMonitor {
...
foreach my $TestVar (@ForRunPerProduct) {
state $testScript_template = "U:/perl.exe ... %s -t lnx64";
...
$TestVarDirName = dirname ($TestVarDirName);
$testScript = sprintf $testScript_template, $TestVarDirName;
...
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/506222.html