2016-10-10 8 views
0

ファイルを読み込む短いperlスクリプトを記述します。 tmp.txtを参照してください:Perl: "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つの引数を使用する: 'open my $ IN、 '<'、 'tmp.txt or die ...' – Toto

+2

'またはdie ... 'は、' autodie'を使っているので余計です。 – Toto

答えて

6

これはautodieまたは致命的にパッケージファイルハンドル(例えば、FILE)を使用した場合に警告を発生させることができる「一度だけ使用」autodie

BUGSセクションの下に記載されています。 の代わりに、スカラファイルハンドルを強くお勧めします。


use diagnostics;言う:一度だけ使用

名 "メイン:: IN":test.plライン9(#1) で可能なタイプミス(W 1回)入力ミスのエラーが頻繁に表示一意の変数名として扱います。 一意の名前を持つのに十分な理由があった場合は、 というメッセージを何とかして返信してください。私たちの宣言はまた、この目的のために提供された です。

注:この警告は、 のみ使用されたパッケージシンボルを検出します。 これは、字句変数がこの警告を決して引き起こさないことを意味します。 また、 * c、& c、サブc {}、c()、およびc(ファイルハンドルまたは書式)と同様に、パッケージ変数$ c、@c、%c、 ;プログラムが$ cを1回だけ使用し、 のいずれかを使用すると、この警告は発生しません。 アンダースコアで始まるシンボルと特別な識別子(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を読めば、あなたが表示されます:autodieまたは致命的(例えば、FILE)パッケージのファイルハンドルを使用する場合、 "一度だけ使用される"

BUGS^

が警告を発生させることができます。代わりにスカラファイルハンドルを強くお勧めします。

私はそれをお勧めしたいがためor dieがそれを処理しようとしているautodieに比べて、処理されている方法のためです。

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

そしていずれかautodieまたはor die

しかし、私はまた、3引数openを使用するためのより良いスタイルだろうことをお勧めしたいです。あなたのプロセスがopenに失敗した場合、どちらの方法が適用されるかはわかりません。

関連する問題