2009-04-02 6 views

답변

14

@foo에 {} 님의 중괄호가 그것을 만들고 있습니다. 중괄호는 이름없는 해시 참조를 만듭니다.

당신이 =()

4

당신은 실수로 @foo의 해시 참조가 빈 목록에 @foo 설정 @foo 사용합니다. 역 참조하지 않고 (거의 항상 우연히) 레퍼런스를 출력 할 때 디버깅 문자열 (레퍼런스 유형과 메모리 위치)을 얻는다.

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

자세한 내용은 perldoc perlreftutperldoc perlref을 참조하십시오.

3

코드는 다음과 같이 기록한다 :

use strict; 
use warnings; 

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

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

당신은 빈 변수를 원한다면, 펄에서 변수를 초기화 할 필요가 없습니다. 그러나 my을 사용하여 지역 변수를 선언해야합니다. 그리고 내장 함수를 둘러싼 괄호는 필요 없으며 단지 혼란을 야기합니다.

6

이런 종류의 문제를 이해하는 열쇠는 출력에 여분의 항목이 있다는 것입니다. 그 항목이 무엇인지는 그렇게 중요하지 않습니다.

일반적으로 컨테이너 변수의 내용이 예상보다 많거나 적은 경우 가장 먼저해야 할 일은 내용을 보는 것입니다. 데이터 :: 덤퍼 모듈은 펄와 함께 제공 할 수있는 고급 인쇄 데이터 구조 :

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

당신이, 당신이 거기에 도착하는 방법을 알아 뒤로 작업을 시작할 수있는 컨테이너에 표시되면. 결국에는 @foo를 초기화 한 직후에 이미 하나의 요소가 있다는 것을 알게 될 것입니다. 이는 당신이 원하는 것이 아닙니다.

또 다른 트릭은리스트 내에있는 요소의 수를 확인하는 것입니다 :

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

당신은 당신이 기대하지 않는 번호를 경우 추가 요소가 나타 났을 때 알아 뒤로 작동합니다.

관련 문제