내 Perl 출력에 해시 (0xabcdef)가 보이는 이유는 무엇입니까?
-
22-08-2019 - |
문제
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
로컬 변수를 선언합니다. 그리고 내장 기능 주위에 괄호가 필요하지 않으며 혼란을 더합니다.