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

时间:2015-05-05 13:13:47

标签: perl

我正在编写我的第一个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.

3 个答案:

答案 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个调用,而无需指定文件句柄

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

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

#!/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';
}