2013-04-18 3 views
1

나는 펄 스크립트를 here에서 배우고있다. 해시를 만드는 데 문제가 있습니다. 코드는 다음과 같습니다.Perl에서 해시를 만들 수 없습니까?

print "Hello World!\n"; 
@days = ("1", "2"); 
print "There are $#days days\n"; 
print "1 is $days[0]\n"; 
%months = ("a" => 1, "b" => 2, "c" => 3); 
print "There are $#months keys\n"; 
print "a is $months[0]\n"; 
for $i (keys %months) 
{ print "$i has value $months[$i].\n"} 

이제 배열이 제대로 작동합니다. 해시 인쇄에는 "-1 키가 있습니다." 마지막으로 인쇄 호출시 변수 값에 아무 것도 인쇄하지 않습니다.

+0

[처음에 언급 한 튜토리얼의 최신 버전을 사용하십시오.] (http://www.perl.com/pub/2008/04 /23/a-beginners-introduction-to-perl-510.html) - 여러분이 언급 한 것은 2000 년부터이며 [modern]이 아닙니다 (http://www.onyxneon.com/books/modern_perl/index.html).) 전혀! – Xaerxess

+0

@Xaerxess 나는 나이가 든 사람을 더 잘 이해한다! :) –

+2

@Cool_Coder : *이 튜토리얼 버전을 사용하지 마십시오 : 13 년이 넘었습니다! Perl 5 버전 8이 출시되기 전에 작성되었습니다.이 버전은 사람들이 Perl을 사용하는 방식에 대해 많은 변화를 일으킨 획기적인 릴리스였습니다. 버전 10과 버전 14도 중요한 업데이트였습니다. 우리는 지금 버전 16에 있으며, 버전 18의 출시가 임박했습니다! 학습용 버전 6을 계속 사용한다면 더 이상 관련이없는 나쁜 습관을 배울 것이며 현대식 Perl 코드를 이해하는 데 도움이되지 않습니다. – Borodin

답변

6

해시에서 배열 구문을 사용하고 있는데, 이는 전혀 생각하지 않습니다. 해시에서 작동하는 대신 @months이라는 배열에서 작업하고 있습니다. 예를 들어 :

print "There are $#months keys\n"; 

이 배열 @months을 찾을 것입니다, 그것은 비어있는 것을보고, 행복하게 -1을 인쇄 할 수 있습니다.

당신이 할 때 펄이 키 0 될 것 숫자에 a, bc을 변환하려고합니다

for $i (keys %months) { 
    print "$i has value $months[$i].\n" 
} 

.

Argument "a" isn't numeric in array element ... 

그런 다음이 빈 배열 요소 $month[0]을 인쇄합니다 :이 경고를 발행합니다. 어떤 정의되지 않은 값 경고를 발급합니다. 사용하지 않았기 때문에 이러한 경고를받지 못합니다.

use strict; 
use warnings; 

스크립트에 있습니다. strict@months이 신고되지 않았으며 즉시이 버그를 중단 시켰다고 말했을 것입니다. 당신이 사용해야

구문은 다음과 같습니다

print "There are " . (keys %months) . " keys\n"; 
... 
print "$i has value $months{$i}\n"; 
+0

그럼 Hash의 엘리먼트를 배열로 변환하지 않고 해쉬에 얼마나 많은 키가 있는지를 어떻게 알 수 있습니까? –

+0

@Cool_Coder 죄송합니다, 질문을 편집하는 동안 전화를 걸었습니다. 이제 추가되었습니다. – TLP

+0

그 추가 정보 주셔서 감사합니다 :) –

0

$#months$months[0]가 배열이 아닌 해시를 참조하십시오. 중괄호 $months{key}을 사용하여 해시 값에 액세스합니다.

use strict; 또한 변수를 my()으로 초기화해야합니다. 이 작업을 수행했다면 @months이라는 컴파일러 오류가 발생했을 것입니다.

3

Perl에서 해시의 요소에 액세스하는 것은 배열과 약간 다른 구문을 사용합니다.배열에 대한 해시에 대한 중괄호, 대괄호를 사용

:

print "a is $months{a}\n"; # "a is 1" 

그리고 $#months은 당신이 정말로 의미하는 것은 %months에서 키의 수를 계산했다 '@months의 마지막 인덱스'를 말하는 또 다른 방법입니다

printf "There are %d keys\n", scalar keys %months; 

당신은 print 대신 printf 주장하는 경우 :

print "There are $#{[keys %months]} keys\n"; 

(하지만 어쩌면 내가 t는 몇 단계 앞으로 가고 싶습니다.)

+0

고마워요! 해시 크기가 큰 경우 구문에 대한 언급이 빠르다는 것을 알고 싶습니까? –

+0

시도해 보시기 바랍니다. 귀하의 필요에 "충분히 빠르지"않은 경우 다른 질문으로 다시 회신하십시오 (그러나 이것이 우려 될 수는 없습니다). – Zaid

+1

'큰'이 무슨 뜻인지에 따라 다르지만, 이것은 해시에서 키의 수를 찾는 표준 방법이며, 아무 때라도 알아 차리지 못했습니다. 스칼라 컨텍스트에서 평가 될 때 키 엔트리를 계산하는 'keys'구현에 단축키가있을 수 있으므로 실제로 목록 컨텍스트와 같은 키 배열을 작성하지는 않습니다. –

관련 문제