1

行列乗算のスクリプトを作成しようとしています。これは単なる基本的なプログラムですが、次のエラーについては理解できません。

グローバル シンボル "@ref_mat1" には、multiplication.pl の 49 行目に明示的なパッケージ名が必要です。

グローバル シンボル "@ref_mat2" には、multiplication.pl の 49 行目に明示的なパッケージ名が必要です。

以下は私のスクリプトです:

 #!/usr/bin/perl -w
    use strict;

     my @mat1=(
        [2,3,4],
        [1,2,3],
        [3,4,5]
            );

    my @mat2=(
            [2],
            [3],
            [4]
           );


    my ($i, $j, $k);
    my $r_product=[];

   $r_product= mat_multiplication(\@mat1,\@mat2);

    sub mat_multiplication
        {

         my ($ref_mat1,$ref_mat2)=@_;
         my($mat1_row,$mat1_col)=total_rows_column($ref_mat1);
         my($mat2_row,$mat2_col)=total_rows_column($ref_mat2);
             for($i=0;$i<$mat1_row;$i++)
            {
               for($j=0;$j<$mat2_col;$j++)
                {
                   my $sum=0;
                   for($k=0;$k<$mat1_col;$k++)
                    {
                      $sum=$sum+$ref_mat1[$i][$k]*$ref_mat2[$k][$j];
                    }
                    $r_product->[$1][$j]=$sum;
                }
            } 
            return $r_product;

        }


    sub total_rows_column
             { 
              my($r_mat) =@_;
              my $num_row=@{$r_mat};
              my $num_col=@{$r_mat->[0]};
              return($num_row,$num_col);
             }

この問題を検索したところ、1 つのリンクが見つかりました

「グローバル シンボルには明示的なパッケージ名が必要」の説明

しかし、まだ解決できていません。見て、どこで間違いを犯しているのか教えてください。

ありがとう

4

1 に答える 1

7

$ref_mat1および$ref_mat2は配列への参照です。$reference[$idx]Perlでは、配列への参照にアクセスする場合、直接使用することはできません。->次のように、参照の後に演算子を使用する必要があります$ref_mat1->[0]

それがなければ、Perlはそれが存在しない$ref_mat1[0]配列を参照していると考えます。@ref_mat1はい、両方とも$var@var異なるコンテンツで同時に存在する可能性があります。次の例を参照してください。

use strict;
use Data::Dumper;

my $abc = 42;
my @abc = (1, 2, 3);

print Dumper($abc), Dumper(\@abc);
于 2012-08-31T07:00:28.473 に答える