문제

Sun4-Solaris-64int 용으로 제작 된 Perl, v5.6.1을 실행하고 있습니다

배열에서 인쇄를 호출하고 있습니다.

print "@vals\n";

그리고 출력은 다음과 같습니다.

HASH(0x229a4) uid cn attuid

또는 또 다른 예 :

@foo = {};
push(@foo, "c");

print "@foo I am done now\n";

출력과 함께 :

HASH(0x2ece0) c I am done now

어디에 HASH(0x2ece0) 에서 오는?

도움이 되었습니까?

해결책

@foo = {}의 버팀대가 생성됩니다. 버팀대는 이름없는 해시 참조를 만듭니다.

@foo를 빈 목록으로 설정하려면 @foo = ()를 사용하십시오.

다른 팁

이러한 종류의 문제를 이해하는 열쇠는 출력에 추가 항목을 얻는다는 것입니다. 그 항목이 무엇인지 너무 중요하지 않습니다.

일반적으로, 컨테이너 변수에 컨테이너 변수가 더 많거나 적을 때 가장 먼저하고 싶은 것은 내용물을 보는 것입니다. Data :: Dumper 모듈에는 Perl이 제공되며 데이터 구조를 예쁘게 인쇄 할 수 있습니다.

use Data::Dumper;
print Dumper( \@foo );

컨테이너에 무엇이 있는지 보면 뒤로 작업하여 어떻게 들어가는 지 알아낼 수 있습니다. 당신은 결국 @foo를 초기화 한 직후에 이미 하나의 요소가 있다는 것을 알게 될 것입니다.

또 다른 요령은 목록의 요소 수를 확인하는 것입니다.

print "There are " . @array . " elements in \@array\n";

예상치 못한 숫자를 얻으면 추가 요소가 나타 났을 때를 알아보기 위해 뒤로 작업하십시오.

실수로 @foo에 해시 참조가 있습니다. 비로식하지 않고 참조를 인쇄 할 때 (거의 항상 우연히) 디버깅 문자열 (참조 유형 및 메모리 위치)을 얻습니다.

나는 당신이 원한다고 생각합니다 my @foo = (); push @foo, "c"; 당신이 지금 가지고있는 것보다. 반면에, 당신은 또한 단순히 말할 수 있습니다 my @foo; 배열을 만듭니다. 명시 적으로 비어있을 필요가 없습니다. ().

보다 perldoc perlreftut 그리고 perldoc perlref 참고 문헌에 대한 자세한 내용.

코드는 다음과 같이 작성해야합니다.

use strict;
use warnings;

my @foo;
push @foo, "c";

print "@foo I am done now\n";

빈 변수를 원한다면 Perl에서 변수를 초기화 할 필요가 없습니다. 그러나 당신은 사용해야합니다 my 로컬 변수를 선언합니다. 그리고 내장 기능 주위에 괄호가 필요하지 않으며 혼란을 더합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top