使用$ ^ I并提供参数

时间:2015-03-09 15:15:32

标签: perl file command-line command-line-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;
}

我使用以下命令行条目&#34; perl inputupdate.pl input.dat 2 3 4&#34; 调用脚本。代码将看起来吐出&#34;无法打开4:没有这样的文件&#34; 如果我只是在命令行提供文件,它可以正常工作。有什么想法吗?

3 个答案:

答案 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);