内部配列をPerlの関数に渡そうとしています。 ここに私のPerlプログラムがあります。内部配列を関数に渡す
#!/usr/bin/perl
use strict;
use warnings;
my %data = (
'a' => (
x => 'Hello',
y => 'World'
),
'b' => (
x => 'Foo',
y => 'Bar'
)
);
#prototype
sub p(\%);
{ #main
p(%data{'a'}); # should print "Hello Wolrd".
}
sub p(\%) {
print "$_[0]{x} $_[0]{y}\n";
}
代わりに、次のエラーが表示されます。Type of arg 1 to main::p must be hash (not key/value hash slice)
。
これは動作します:
#!/usr/bin/perl
use strict;
use warnings;
#prototype
sub p(\%);
{ #main
my %a = (
x => 'Hello',
y => 'World'
);
p(%a);
}
sub p(\%) {
print "$_[0]{x} $_[0]{y}\n";
}
だから、メソッド呼び出しに何か問題がなければなりません。しかし何? の内容はハッシュなので、p(
後の最初の文字が%
が(私もp($data{'a'});
を試してみましたでなければならないが、それはの内容から、論理的と思われる別のエラー(と私の葉)スカラーではありません。私は、関数のプロトタイプを宣言しているため、手動でハッシュと間接参照への参照を作成する必要はありません。私は何をしないのですか?
内側の配列定義に中カッコを使用しても何も変更されませんが、エラーは残ります。 '$ data {'a'}'を使って要素にアクセスすると、他のエラーメッセージが表示されます。これは 'arg :: 1のタイプ:: main :: pはハッシュ(ハッシュ要素ではありません)'でなければなりません。プロトタイプ宣言を削除すると実際にはうまくいきますが、 'main :: p()はex2.pl 17行目でプロトタイプをチェックするのが早すぎます。' '警告を使用しないようにします。それらの多くは私にはヘルフプルに見えます。プロトタイプ**や**を削除せずにこれを修正することも可能ですか? – Paramaeleon
プロトタイプの両方の言及を削除します。 – choroba