我正在编写我的第一个perl脚本,无法编译它。我想读取一个文件,并将符合正则表达式条件的每一行输出到一个新文件。我得到一个“全局符号需要显式包名称”错误,这似乎与我读过的可变范围问题有关。我无法弄清楚我的代码有什么问题。
代码:
#!/usr/bin/perl -w
use strict;
use warnings;
print "Stripping lines from data dump where WREN column is FFF\n"
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.
答案 0 :(得分:7)
单个语法错误会导致解析器足以在事后产生多个错误错误并不罕见。就是这种情况。
您的第一个错误是需要注意的。您在第6行末尾(near "my "
上的line 8
)错过了分号。
以下所有“全局符号...”错误只是通过尝试将第6..8行解析为单个命令而产生的混淆。
答案 1 :(得分:3)
您没有使用分号print
来终止;
语句,因此my $infilename
被视为该语句的一部分。
答案 2 :(得分:3)
正如您所读到的,在第一个print
语句的末尾您缺少分号。以后的错误消息将取决于Perl对您的错误脚本的判断,并且通常不可靠。
其他一些观点
您应该在命令行或shebang行上use warnings
优先于-w
。两者都是错误的
数据文件不需要前导./
。这仅适用于从shell运行可执行文件时,如果没有提供路径,则在搜索给定文件名时使用PATH
您应该在程序中尽可能晚地声明词汇变量。如果是文件句柄,那就在open
调用中,就像使用$out
select
语句允许您编写后续print
个调用,而无需指定文件句柄
最好使用substr
或unpack
从每条记录中提取固定位置子字符串
这会留下一个看起来像这样的程序
#!/usr/bin/perl
use strict;
use warnings;
print "Stripping lines from data dump where WREN column is FFF\n";
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';
}