2015-05-05 32 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'; 
} 
相關問題