Perl:名称"main :: IN"仅使用一次,但它实际上是使用的

irr*_*rom 1 perl autodie

我写了一个读取文件的简短perl脚本.见tmp.txt:

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
Run Code Online (Sandbox Code Playgroud)

我的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";
Run Code Online (Sandbox Code Playgroud)

它输出:

 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 
Run Code Online (Sandbox Code Playgroud)

我用过IN,所以我不明白这个Name "main::IN" used...警告.为什么抱怨?

Cha*_*hak 7

这是在autodie的BUGS部分中提到的

当autodie或Fatal与包文件句柄(例如,FILE)一起使用时,可以生成"仅使用一次"警告.强烈建议使用标量文件句柄.


use diagnostics; 说:

名称"main :: IN"仅使用一次:test.pl第9行(#1)的可能拼写错误(W一次)印刷错误通常显示为唯一变量名称.如果您有充分的理由拥有一个唯一的名称,那么只需再次提及它就可以抑制该消息.我们的声明也是为此目的而提供的.

注意:此警告检测仅使用过一次的包符号. 这意味着词法变量永远不会触发此警告.它还意味着所有包变量$ c,@ c,%c,以及*c,&c,sub c {},c()和c(文件句柄或格式)都被认为是相同的; 如果一个程序只使用$ c一次,但也使用任何其他程序,它将不会触发此警告.以下划线开头的符号和使用特殊标识符(qv 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";
Run Code Online (Sandbox Code Playgroud)