我写了一个读取文件的简短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...警告.为什么抱怨?
这是在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)