我正在尝试执行一些现场编辑。我有一个基本的片段,适用于我有硬编码替代品的地方。我试图通过现在传入变量来推广脚本,但它失败了。
我的代码
use strict;
use warnings;
$^I = '.bak';
my $pow = shift;
my $pres = shift;
my $temp = shift;
#my $dir= shift || '.';
#my $fileName = "$dir/input.dat";
#open DATA, $fileName or die "Cannot open $fileName for read :$!";
while (<>){
s/^\s+tfwi\s+=\s+\d+.\d+E?[+-]?\d+/ tfwi = $temp/;
s/^\s+RP\s+=\s+\d+.\d+E?[+-]?\d+/ RP = $pow/ig;
s/^\s+pdome\s+=\s+\d+.\d+E?[+-]?\d+/ pdome = $pres/ig;
print;
}
我使用以下命令行条目&#34; perl inputupdate.pl input.dat 2 3 4&#34; 调用脚本。代码将看起来吐出&#34;无法打开4:没有这样的文件&#34; 如果我只是在命令行提供文件,它可以正常工作。有什么想法吗?
答案 0 :(得分:1)
input.dat
转移到$pow
。
2
转移到$pres
。
3
转移到$temp
。
不再有移位,因此4
仍保留在@ARGV
中,并被解释为diamon运算符ARGV
读取的文件句柄<>
的文件名。
答案 1 :(得分:1)
Perl将ARGV设置为('input.dat',2,3,4)并按该顺序处理args,因此将文件名移动到arg列表的末尾并运行:
perl inputupdate.pl 2 3 4 input.dat
答案 2 :(得分:1)
你有
my $pow = shift;
my $pres = shift;
my $temp = shift;
input.dat
分配给$pow
,2
分配给$pres
,3
$temp
和4
中留下@ARGV
。解决方案1:更改参数以匹配代码。
perl inputupdate.pl 2 3 4 input.dat
解决方案2:更改代码以匹配参数。
my ($pow, $pres, $temp) = splice(@ARGV, 1);