如何在perl中调用子程序?

hhl*_*hhl -3 perl subroutine malformed

我尝试在Perl中调用子例程,但是我得到了这个错误"Malformed prototype for main".我有一个子程序比较,我必须传递给它两个整数.

#!/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);
Run Code Online (Sandbox Code Playgroud)

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

Sob*_*que 5

这是错的:

sub Compare($p1,$p2){      
Run Code Online (Sandbox Code Playgroud)

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

你可能想要:

sub Compare{      
    my ( $p1, $p2 ) = @_; 
     #etc.
Run Code Online (Sandbox Code Playgroud)

另外:打开use strict;并打开use warnings;.起初他们很讨厌,但是在编程陷阱时他们确实做了很多好事.

喜欢:

sizeof(ListA) 
Run Code Online (Sandbox Code Playgroud)

无效,因为ListA是一个赤字.或者是一个字符串.但它不是你的大小@ListA.这比你想象的要简单 - 标量上下文中的列表返回它的长度.所以你可以简单地做$p1 > @ListA,它会工作.

和:

 if(ListA($p1) = ListB($p2)){     
Run Code Online (Sandbox Code Playgroud)

方法是:

  • 再次使用裸字(所以不要引用@ListA).
  • 使用()何时应该使用[].(访问数组索引是$arrayname[0])
  • 使用=哪个是一个分配,而不是==(或eq用于字符串)作为比较.