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

时间:2016-10-10 12:45:17

标签: 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

我的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...警告。为什么抱怨?

2 个答案:

答案 0 :(得分:7)

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

  

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

use diagnostics;说:

  

姓名&#34; main :: IN&#34;仅使用一次:test.pl第9行(#1)可能的拼写错误   (W一次)印刷错误通常显示为唯一的变量名称。   如果你有充分的理由拥有一个独特的名字,那就提一下   它再次以某种方式压制消息。我们的声明也是   为此目的而提供。

     

注意:此警告检测仅使用过的包装符号   一旦。 这意味着词汇变量永远不会触发此警告。   它还意味着所有的包变量$ c,@ c,%c,以及   * c,&amp; 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 :(得分:2)

我很确定这是因为autodie

我不确切知道为什么,但是如果你将其删除,它就会消失。

如果您阅读perldoc autodie,您会看到:

  

BUGS ^

     

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

由于or die正在处理的方式,与试图处理它的autodie相比,我建议这样做。

但是我也建议使用3参数open会更好的风格:

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

autodieor die。我必须承认,如果您的流程确实未通过open,我不确定应用这两种方式。