2015-05-05 13 views
3

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

在第5行的print语句中添加一个分号';'。当您使用'use warnings'时,不需要在'shebang'行中添加'-w',它们都有相同的含义。 – serenesat

+1

@serenesat,'-w'也会影响模块(假设它们没有'使用警告')。 – ikegami

+0

[全局符号需要显式包名称](http:// stackoverflow。COM /问题/ 3141412 /全局符号需要显式包名) –

回答

7

一个单一的语法错误会抛出解析器足以在事后产生多个错误错误并不罕见。这是这种情况。

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

接下来的所有“全局符号...”错误只是试图将第6..8行解析为单个命令而产生的混淆。

3

你是不是有这样的my $infilename被视为该声明的一部分分号;终止您print声明。

3

正如您所阅读的,您在第一个print语句末尾有一个缺失分号。后来的错误信息将取决于Perl拒绝你的错误脚本,并且往往不可靠。

的其他一些观点

  • 您应该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'; 
} 
相关问题