在替换迭代器

时间:2015-11-25 20:52:19

标签: perl

我正在尝试运行我编写的这个程序,并且我不断收到一条错误消息,指出以下内容

  

在替换迭代器中使用未初始化的值$ ARGV [1]   ./replaceName.pl第22行。

因为值是从命令行传递的名称,并且是第二个参数,我不确定是什么问题。

#!/usr/bin/env perl
use warnings;


@FILES = glob("*.txt");

foreach my $file(@FILES){
    if( !defined($ARGV[2]) ){
         $outfile = "$file.modified.txt";
    }
    else {
        $outfile = $ARGV[2];
    }

    open FILE, "< $file" or die("File not found");
    @lines = <FILE>;
    close FILE;

    open OUT, ">", $outfile;
    foreach my $line (@lines) {
        $line =~ s/YourName/$ARGV[1]/gi;
        print OUT $line;
    }
    close OUT;
}

1 个答案:

答案 0 :(得分:3)

不要忘记在Perl中数组的索引是0,而@ARGV的元素不包含程序名。您应该使用$ARGV[0]$ARGV[1]。您可以通过打印出数组的值来检查这一点 - 索引处的索引和值。

请参阅perldoc perlvar

  

数组@ARGV包含用于脚本的命令行参数。 $#ARGV通常是参数的数量减去1,因为$ARGV[0]是第一个参数,而不是程序的命令名本身。有关命令名称,请参阅$0

请注意,这意味着如果您运行:

perl script.pl something or-another

@ARGV数组在元素0和1中分别有两个条目:somethingor-another。同样,如果脚本是可执行的:

script.pl something or-another

如果您检查$ARGV[2],您将使用默认文件名和所显示的任一调用 - 将2更改为1.此外,您应该能够将测试和分配移至{{1在循环之外,只打开一次该文件。目前,你为每个新文件删除它,所以有效地你只处理最后一个文件。