文件打开错误 - 全局符号"$infilename"需要显式包名称



我正在编写我的第一个perl脚本,但无法编译它。 我想读取一个文件并将与正则表达式条件匹配的每一行输出到一个新文件。 我收到"全局符号需要显式包名称"错误,这似乎与我所阅读的变量范围问题有关。 不过,我无法弄清楚我的代码出了什么问题。

法典:

#!/usr/bin/perl -w
use strict;
use warnings;
print "Stripping lines from data dump where WREN column is FFFn" 
my $infilename = "./test_in.txt";
my $outfilename = "./test_out.txt";
my $in = undef;
open($in,  "<",  $infilename)  or die "Can't open $infilename: $!";
open(my $out, ">",  $outfilename) or die "Can't open $outfilename: $!";
while (<$in>) {     # assigns each line in turn to $_
if (/.{73}FFF/){
print $out $_;
}
}

错误信息:

syntax error at strip_nonwrites.pl line 8, near "my "
Global symbol "$infilename" requires explicit package name at strip_nonwrites.pl line 8.
Global symbol "$infilename" requires explicit package name at strip_nonwrites.pl line 12.
Global symbol "$infilename" requires explicit package name at strip_nonwrites.pl line 12.
Execution of strip_nonwrites.pl aborted due to compilation errors.

单个语法错误会让解析器在事后产生多个错误的情况并不少见。 这是这样一种情况。

您的第一个错误是要注意的错误。 您在第 6 行末尾缺少一个分号(near "my "line 8上)。

所有"全球符号..."下面的错误只是尝试将第 6..8 行解析为单个命令而造成的混淆。

您不会用分号;终止print语句,因此my $infilename被视为该语句的一部分。

如您所读,第一个print语句的末尾缺少一个分号。后面的错误消息将取决于 Perl 对错误脚本的处理方式,并且通常不可靠。

其他一些要点

  • 您应该优先use warnings在命令行或 shebang 行上-w。两者同时是错误的

  • 不需要对数据文件进行领先的./。这仅适用于从 shell 运行可执行文件时,如果未提供路径,则在 PATH 中搜索给定的文件名时

  • 您应该在程序中尽可能晚地声明词法变量。对于文件句柄,这是在open调用内部,就像您对$out所做的那样

  • select语句允许您编写后续print调用,而无需指定文件句柄

  • 最好使用substrunpack从每条记录中提取固定位置的子字符串

这留下了一个看起来像这样的程序

#!/usr/bin/perl
use strict;
use warnings;
print "Stripping lines from data dump where WREN column is FFFn";
my ($infilename, $outfilename) = qw/ test_in.txt test_out.txt /;
open my $in_fh,  '<',  $infilename   or die qq{Can't open "$infilename" for input: $!};
open my $out_fh, '<',  $outfilename  or die qq{Can't open "$outfilename" for output: $!};
select $out_fh;
while ( <$in_fh> ) {
print if substr($_, 73, 3) eq 'FFF';
}

最新更新