使用 $^I 并提供参数

Use $^I and supply arguments

我正在尝试执行一些就地编辑。当我有硬编码替代品时,我有一个基本片段可以使用。我现在试图通过传入变量来概括脚本,但它失败了。

我的代码

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;
}

我使用以下命令行条目调用脚本 "perl inputupdate.pl input.dat 2 3 4"。代码看起来会吐出来 "Can't open 4: No such file" 如果我只在命令行提供一个文件,它就可以正常工作。有什么想法吗?

input.dat 转移到 $pow.

2 转移到 $pres.

3 转移到 $temp.

没有更多的转变,因此 4 保留在 @ARGV 中,并被解释为 diamon 运算符 <> 读取的文件句柄 ARGV 的文件名。

Perl 将 ARGV 设置为 ('input.dat', 2, 3 ,4) 并按该顺序处理 args,因此将您的文件名移动到 arg 列表的末尾 运行:

 perl inputupdate.pl 2 3 4 input.dat

你有

my $pow = shift;
my $pres = shift;
my $temp = shift;
  • 这会将 input.dat 分配给 $pow,
  • 2 分配给 $pres,
  • 分配 3 $temp
  • @ARGV 离开 4

解决方案 1:更改参数以匹配代码。

perl inputupdate.pl 2 3 4 input.dat

解决方案 2:更改代码以匹配参数。

my ($pow, $pres, $temp) = splice(@ARGV, 1);