我有这样的输入:
100 200 A_30:120,A_140:180,B_180:220
100 300 A_70:220,B_130:300,A_190:200,A_60:300
我想计算每一行中A或B的数量,并将每行中A或B的范围与两个第一列中的范围进行比较,并返回交叉长度。例如第一行的输出:A:2 A_length:40 B:1 B_length:20
while(<>){
chomp($_);
my @line = split("\t| ", $_);
my $col1 = $line[0];
my $col2 = $line[1];
my @col3 = split(",",$line[2]);
my $A=0;
my $B=0;
my $A_length=0;
my $B_length=0;
for my $i (0 .. @col3-1){
my $col3 = $col3[$i];
if ($col3 =~ /A/){
my $length=0;
$length = range ($col3,$col1,$col2);
$A_length = $A_length+$length;
$A++;
}
if ($col3 =~ /B/){
my $length=0;
$length = range ($col3,$col1,$col2);
$B_length = $B_length+$length;
$B++;
}
$i++;
}
print("#A: ",$A,"\t","length_A: ",$A_length,"\t","#B: ",$B,"\t","length_B: ",$B_length,"\n");}
sub range {
my ($col3, $col1, $col2) = ($_[0],$_[1],$_[2]);
my @sub = split(":|_", $col3);
my $sub_strt = $sub[1];
my $sub_end = $sub[2];
my $sub_length;
if (($col1 >= $sub_strt) && ($col2 >= $sub_end)){
$sub_length = ($sub_end) - ($col1);}
if (($col1 >= $sub_strt) && ($col2 >= $sub_end)){
$sub_length = ($col2) - ($col1);}
if(($col1 <= $sub_strt) && ($col2 >= $sub_end)){
$sub_length = ($sub_end) - ($sub_strt);}
if(($col1 <= $sub_strt) && ($col2 <= $sub_end)){
$sub_length = ($col2) - ($sub_strt);}
return $sub_length;
}
我固定了它:)
答案 0 :(得分:4)
Perl已经有一个内置length
函数,只有一个参数。由于perl正在编译您的脚本并进入length
函数调用,它不知道您稍后在脚本中定义的sub length { ... }
,因此它抱怨您正在使用内置length
1}}功能不正确。
如何解决这个问题?这是Perl,所以有很多方法
&
sigil调用您的函数:my $length = &length($col3,$col1,$col2);
这将足以提示您的函数调用不会引用内置函数的编译器。main::length($col3,$col1,$col2)
或::length($col3,$col1,$col2)
。 请注意,即使Perl确实知道您定义的length
函数(例如,您可以通过将sub length { ... }
定义移动到脚本顶部来获知Perl),函数调用仍然会对编译器不明确,编译器会发出类似
Ambiguous call resolved as CORE::length(), qualify as such or use & at ...
并且您的脚本仍然无法编译。这里CORE::length
意味着Perl正在解决有利于内置函数的歧义。