在Perl中搜索和替换文件?

时间:2014-10-02 13:05:31

标签: bash perl

关于另一个SO问题的示例here

我将以下代码添加到我的基本perl脚本中。

#!/usr/bin/perl

$^I = '.bak'; # create a backup copy 

while (<>) 
{
   s/NewProdId/$ARGV[1]/g; # do the replacement
   s/PortId/$ARGV[2]/g; # do the replacement
   s/AssemblyId/$ARGV[3]/g; # do the replacement
   print; # print to the modified file
}

然而,当我使用多个参数调用perl脚本时,它会中断。它似乎误将我的另一个参数误认为是打开它的文件名。

  

无法打开1-THU-71:。/ process.pl第11行没有此类文件或目录,&lt;&gt;第37行。

     

无法打开1-5XJ0DF:./process.pl行没有此类文件或目录   11,&lt;&gt;第37行。

     

无法打开1-3F0MB9:./process.pl行没有此类文件或目录   11,&lt;&gt;第37行。

我的bash脚本调用是这样的:

./process.pl "test.txt" $values

我在这里做错了什么?

1 个答案:

答案 0 :(得分:5)

菱形运算符<>尝试打开参数中提到的所有文件。您应该从@ARGV中删除不是文件名的元素:

my @ar = @ARGV;
@ARGV = shift @ARGV;

while (<>) 
{
   s/NewProdId/$ar[1]/g; # do the replacement
   s/PortId/$ar[2]/g; # do the replacement
   s/AssemblyId/$ar[3]/g; # do the replacement
   print; # print to the modified file
}