如何在perl中调用子程序?

时间:2015-10-23 12:36:52

标签: perl subroutine malformed

我尝试在Perl中调用子例程,但是我得到了这个错误"主要"的格式错误的原型。我有一个子程序比较,我必须传递给它两个整数。

#!/usr/bin/perl
@ListA=(1,2,3);
@ListB=(2,3,4);
@ListResult;
#AND

sub Compare($p1,$p2){                   
    if($p1 > sizeof(ListA) or $p2 > sizeof(ListB))
        { 
                  return;}                          

    if(ListA($p1) = ListB($p2)){                    
        push (@ListResult, ListA($p1)); 
        Compare($p1+1,$p2+1);           
        return;                         
    }
    if(ListA($p1) > ListB($p2)){        
        Compare($p1,$p2+1);             
        return;                         
    }
    else {                              
        Compare($p1+1,$p2);             
        return;                         
         }
    return;                             
}

Compare(1,1);

请帮助我并解释如何更正此程序。

2 个答案:

答案 0 :(得分:5)

这是错误的:

sub Compare($p1,$p2){      

Perl并不这样做。这将是您报告的错误的来源。 (从技术上讲,它是原型,这是一个你不应该使用的perl功能,因为它不会做你想象的那样)。

你可能想要:

sub Compare{      
    my ( $p1, $p2 ) = @_; 
     #etc.

另外:开启use strict;use warnings;。他们一开始很讨厌,但是当涉及到编程问题时,他们确实做了很多很多

喜欢:

sizeof(ListA) 

无效,因为ListA是一个单词。或者是一个字符串。但不是@ListA的大小。这比你想象的要简单 - 标量上下文中的列表返回它的长度。因此,您只需执行$p1 > @ListA即可。

 if(ListA($p1) = ListB($p2)){     

时:

  • 再次使用裸字(因此不引用@ListA)。
  • 使用()时应使用[]。 (访问数组索引为$arrayname[0]
  • 使用=这是一个分配,而不是==(或eq代表字符串),这是一个比较。

答案 1 :(得分:4)

这段代码看起来真的不像Perl。

#!/usr/bin/perl

# You should always have "use strict" and "use warnings"
# at the top of your Perl programs.

# When you have "use strict", then you need to declare your
# variables, most commonly using "my".
@ListA=(1,2,3);
@ListB=(2,3,4);
@ListResult;
#AND

# Perl subroutines aren't defined like this
sub Compare($p1,$p2){
    # You need to use the @ at the start of the array name
    # whenever you are referring to the whole array.
    # And Perl doesn't have a "sizeof" function.
    # Also, your indentation style is *horrible* here :-)
    if($p1 > sizeof(ListA) or $p2 > sizeof(ListB))
        { 
                  return;}                          

    # I think you're trying to look up individual array elements
    # here. That's $array[$index], not array(index).
    # And in Perl, '=' is always an assignment operator. Here,
    # You probably want '==' which is a comparison operator.
    if(ListA($p1) = ListB($p2)){                    
        push (@ListResult, ListA($p1)); 
        Compare($p1+1,$p2+1);           
        return;                         
    }
    if(ListA($p1) > ListB($p2)){        
        Compare($p1,$p2+1);             
        return;                         
    }
    else {                              
        Compare($p1+1,$p2);             
        return;                         
         }
    return;                             
}

Compare(1,1);

你的程序应该是这样的:

#!/usr/bin/perl

use strict;
use warnings;

# I've changed the names of these variables, because in Perl
# arrays and lists are different things. These are arrays.
my @ArrayA = (1,2,3);
my @ArrayB = (2,3,4);
my @ArrayResult;
#AND

sub Compare {
  my ($p1, $p2) = @_;

  return if $p1 > @ArrayA or $p2 > @ArrayB;         

  if ($ArrayA[$p1] == $ArrayB[$p2]) {
    push (@ArrayResult, $ArrayA[$p1]);
    Compare($p1+1, $p2+1);
    return;
  }

  if ($ArrayA[$p1] > $ArrayB[$p2]){
    Compare($p1, $p2+1);
    return;
  } else {                              
    Compare($p1+1, $p2);
    return;                         
  }
  return;                             
}

Compare(1,1);

那至少会编译。但我不知道它是否有效,因为我不知道它应该做什么。