2016-10-10 37 views
0

我正在編寫一個讀取文件的簡短perl腳本。見tmp.txtPerl:名稱「main :: IN」只使用過一次,但實際使用的是

1 gene_id "XLOC_000001"; gene_name "DDX11L1"; oId 
1 gene_id "XLOC_000001"; gene_name "DDX11L1"; oId 
1 gene_id "XLOC_000001"; gene_name "DDX11L1"; oId 
1 gene_id "XLOC_000001"; gene_name "DDX11L1"; oId 

我的perl程序,convert.pl是:

use warnings; 
use strict; 
use autodie;  # die if io problem with file 
my $line; 
my ($xloc, $gene, $ens); 
open (IN, "tmp.txt") 
    or die ("open 'tmp.txt' failed, $!\n"); 
while ($line = <IN>) { 
    ($xloc, $gene) = ($line =~ /gene_id "([^"]+)".*gene_name "([^"]+)"/); 
    print("$xloc $gene\n"); 
} 
close (IN) 
    or warn $! ? "ERROR 1" : "ERROR 2"; 

它輸出:

Name "main::IN" used only once: possible typo at ./convert.pl line 8. 
XLOC_000001 DDX11L1 
XLOC_000001 DDX11L1 
XLOC_000001 DDX11L1 
XLOC_000001 DDX11L1 

我以前IN,所以我不明白Name "main::IN" used...警告。它爲什麼抱怨?

+1

使用詞法變量和3 arg打開:'打開我的$ IN,'<','tmp.txt或死...' – Toto

+2

'或者死亡...''是多餘的,因爲您正在使用'autodie' – Toto

回答

6

這下autodie

「只使用一次」可以生成警告BUGS部分中提到時autodie或致命使用具有包文件句柄(例如,文件)。 強烈建議使用標量文件句柄,而不是


use diagnostics;說:只能使用一次

名稱 「主:: IN」:在test.pl線可能錯字9(#1) (W一次)印刷錯誤往往表現出作爲唯一的變量名稱。 如果你有一個很好的理由擁有一個獨特的名字,那麼只需提及 它再次以某種方式壓制消息。我們的聲明也爲此提供了 。

注意:此警告檢測僅使用 一次的軟件包符號。 這意味着詞彙變量永遠不會觸發此警告。這也意味着所有的包變量$ c,@ c,%c以及 * c,& c,sub c {},c()和c(文件句柄或格式)被認爲是相同的;如果一個程序只使用$ c一次,但也使用其他任何 ,它不會觸發此警告。以 下劃線開頭的符號和使用特殊標識符(q.v. perldata)的符號是 免於此警告。

所以,如果你使用詞法文件句柄,那麼它不會警告。

use warnings; 
use strict; 
use autodie;  # die if io problem with file 
use diagnostics; 
my $line; 
my ($xloc, $gene, $ens); 
open (my $in, "<", "tmp.txt") 
    or die ("open 'tmp.txt' failed, $!\n"); 
while ($line = <$in>) { 
    ($xloc, $gene) = ($line =~ /gene_id "([^"]+)".*gene_name "([^"]+)"/); 
    print("$xloc $gene\n"); 
} 
close ($in) 
    or warn $! ? "ERROR 1" : "ERROR 2"; 
1

我很確定這是因爲autodie

我不確切地知道爲什麼,但是如果將其刪除,它就會消失。

如果你讀perldoc autodie你會看到:

BUGS^

「只能使用一次」可當autodie或致命與包文件句柄(例如,文件)使用中產生的警告。標量文件句柄強烈建議。

我建議是因爲or die是如何被處理,相比autodie試圖處理它。

不過我也建議這將是更好的風格來使用一個3參數open

open (my $input, '<', 'tmp.txt'); 

而且要麼autodieor die。我必須承認,如果您的流程沒有通過open,我不太確定這兩種方式會採用哪種方式。