내부 배열을 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 행에서 프로토 타입을 검사했습니다. '라는 경고 메시지가 출력됩니다.'use warnings; '을 제거하지 않으려합니다. 그들 중 많은 사람들이 나에게 helfpul을 보입니다. 프로토 타입, ** 또는 **을 제거하지 않고이 특정 문제없이 경고를 계속 유지하면서이 문제를 해결할 수 있습니까? – Paramaeleon
프로토 타입의 두 언급을 제거하십시오. – choroba