将3值传递给sub:参数太多

时间:2013-09-27 22:15:47

标签: perl

我有这样的输入:

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

我固定了它:)

1 个答案:

答案 0 :(得分:4)

Perl已经有一个内置length函数,只有一个参数。由于perl正在编译您的脚本并进入length函数调用,它不知道您稍后在脚本中定义的sub length { ... },因此它抱怨您正在使用内置length 1}}功能不正确。

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

  1. 将您的功能命名为其他内容。使用与Perl内置函数同名的函数通常是个坏主意
  2. 使用& sigil调用您的函数:my $length = &length($col3,$col1,$col2);这将足以提示您的函数调用不会引用内置函数的编译器。
  3. 使用包名称验证您的函数调用,在本例中为main::length($col3,$col1,$col2)::length($col3,$col1,$col2)
  4. 请注意,即使Perl确实知道您定义的length函数(例如,您可以通过将sub length { ... }定义移动到脚本顶部来获知Perl),函数调用仍然会对编译器不明确,编译器会发出类似

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

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