2

コードをモジュール化していますが、sub元のモジュールから移動すると、次のエラーが発生します。

Couldn't load application from file "foo.pl": Not an ARRAY reference at D.pm line 10.

これは元のファイルでした。現状では、すべて問題ありません。

FormerC.pm

package FormerC;

use strict;

my %my_hash = ( key => 'value' );
my @my_array = qw( some strings inside array );

sub problematic_sub {
  my ($hash_ref, $array_ref) = @_;

  my @an_array = @$array_ref;

  return \@an_array;
};

sub uses_problematic_sub {
  problematic_sub(\%my_hash, \@my_array);
};

uses_problematic_sub();

1

これらは2つの新しいモジュールです。これらを使用すると、エラーが発生します。

D.pm

package D;

use strict;

sub new { bless {}, shift };

sub problematic_sub {
  my ($hash_ref, $array_ref) = @_;

  my @an_array = @$array_ref;

  return \@an_array;
};

1

C.pm

package C;

use strict;

use D;
my $d = D->new;

my %my_hash = ( key => 'value' );
my @my_array = qw( some strings inside array );

sub uses_problematic_sub {
  $d->problematic_sub(\%my_hash, \@my_array);
};

uses_problematic_sub();

1
4

2 に答える 2

5

problematic_subあなたはサブとして呼んでいました

problematic_sub(\%my_hash, \@my_array);

しかし、あなたは今、メソッドとしてisを呼び出します:

$d->problematic_sub(\%my_hash, \@my_array);

メソッドとしてコーディングproblematic_subしなかったため、これは正しくありません。problematic_subまた、のパラメータを次のように変更する必要があります。

my ($self, $hash_ref, $array_ref) = @_;
于 2013-01-11T00:53:59.937 に答える
4

Exporterモジュールを使用して、サブルーチン名を呼び出し元のコードの名前空間にエクスポートする方がよい場合があります。ここに書いたのはオブジェクト指向モジュールですが、オブジェクトは単なるサブルーチンのコレクションであり、オブジェクト指向のサポートは必要ありません。

問題は、次のようなメソッド呼び出しです。

$d->problematic_sub(\%my_hash, \@my_array)

オブジェクトを最初のパラメータとして暗黙的に渡すため、次のようになります。

D::problematic_sub($d, \%my_hash, \@my_array)

あなたがする必要があるのは、サブルーチンでこれを説明することです

sub problematic_sub {

  my ($self, $hash_ref, $array_ref) = @_;

  my @an_array = @$array_ref;

  return \@an_array;
}

コードが機能するはずです。

whileまた、またはforループのようなサブルーチン宣言はステートメントではないため、その後にセミコロンを付ける必要はなく、またそうすべきではないことにも注意してください。

于 2013-01-11T00:51:18.240 に答える