0

我有这样的输入:

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;
}

我修好了它 :)

4

1 回答 1

4

Perl 已经有一个内置length函数,它只接受一个参数。由于 perl 正在编译您的脚本并获取您的length函数调用,它不知道sub length { ... }您稍后在脚本中定义的内容,因此它抱怨您length错误地使用了内置函数。

如何解决这个问题?这是Perl,所以有很多方法

  1. 将您的功能命名为其他名称。创建一个与 Perl 内置函数同名的函数通常是个坏主意
  2. &使用sigil调用您的函数:my $length = &length($col3,$col1,$col2);这​​足以向编译器提示您的函数调用不引用内置函数。
  3. 使用包名称来限定您的函数调用,在这种情况下main::length($col3,$col1,$col2)或只是::length($col3,$col1,$col2).

请注意,即使 Perl 确实知道length您定义的函数(例如,您可以通过将定义移动到脚本顶部来让 Perl 知道sub length { ... }),函数调用对编译器来说仍然是模棱两可的,编译器会发出一个警告之类的

Ambiguous call resolved as CORE::length(), qualify as such or use & at ...

并且您的脚本仍然无法编译。这CORE::length意味着 Perl 正在解决歧义以支持内置函数。

于 2013-09-27T22:44:26.197 回答