我正在尝试运行我编写的这个程序,并且我不断收到一条错误消息,指出以下内容
在替换迭代器中使用未初始化的值$ 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;
}
答案 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中分别有两个条目:something
和or-another
。同样,如果脚本是可执行的:
script.pl something or-another
如果您检查$ARGV[2]
,您将使用默认文件名和所显示的任一调用 - 将2更改为1.此外,您应该能够将测试和分配移至{{1在循环之外,只打开一次该文件。目前,你为每个新文件删除它,所以有效地你只处理最后一个文件。