我正在尝试运行我编写的这个程序,但不断收到一条错误消息,其中指出以下内容
在替换迭代器中使用未初始化值 $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;
}
不要忘记 Perl 中数组是从 0 开始索引的,并且@ARGV
不包括程序名称。你可能应该使用$ARGV[0]
and $ARGV[1]
。您可以通过打印数组的值(索引和索引处的值)来检查这一点。
See 佩尔多克·佩尔瓦尔 http://perldoc.perl.org/perlvar.html:
数组@ARGV
包含用于脚本的命令行参数。$#ARGV
通常是参数数量减一,因为$ARGV[0]
是第一个参数,而不是程序的命令名称本身。看$0
为命令名称。
请注意,这意味着如果您运行:
perl script.pl something or-another
the @ARGV
数组有两个条目:something
and or-another
分别在元素 0 和 1 中。同样,如果脚本可执行:
script.pl something or-another
如果你检查$ARGV[2]
,您将使用显示的任一调用的默认文件名 - 将 2 更改为 1。此外,您应该能够将测试和作业移至$outfile
在循环之外,并且只打开该文件一次。目前,您为每个新文件进行 zap,因此实际上您只处理最后一个文件。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)