-4

Perl でサブルーチンを呼び出そうとしましたが、「メインのプロトタイプが不正です」というエラーが表示されます。Subroutine Compare があり、それに 2 つの整数を渡す必要があります。

#!/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);

このプログラムを修正する方法を教えてください。

4

2 に答える 2

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])
  • 比較である(または文字列の場合)=ではなく、割り当てである whichを使用します。==eq
于 2015-10-23T13:01:27.543 に答える