2012-02-21 2 views
10

필자는 Perl에서 스칼라 문맥으로 배열을 평가하는 것이 유용하다는 것을 알았다.Perl에서 해시를 스칼라 컨텍스트로 평가하는 이유는 무엇입니까?

하지만 실제로 스칼라 컨텍스트에서 해시를 평가할 수있는 용도는 무엇입니까? 예 :

  • my $scalar_value = %hash;

  • 지금까지 내가 이해 scalar(%hash)

, 그것은 "3/4"유용 것으로 보인다 해시의 내부에 대한 몇 가지 정보를 제공 같은 문자열을 생산 디버깅 용.

+0

차이점은 무엇입니까? –

+3

배열은'@'sigil이있는 변수이고,리스트는 소스 코드의 일련의 항목입니다. 이 코드에서'@array = (1, 2, 3)','(1, 2, 3)'은리스트이고'@ array'는 배열 변수입니다. perlfaq4에는 더 많은 정보가 들어 있습니다 : http://perldoc.perl.org/perlfaq4.html#What-is-the-difference-between-a-list-and-an-array? –

+1

그러나'scalar (1,2,3,4)'를 쓸 수 없습니까? 그렇다면 "목록"이 진술에 근거하여 정확 했습니까? –

답변

14

해시가 비어 있는지 (키가 없는지) 알 수있는 TRUE/FALSE 플래그로 사용할 수있는 값을 생성합니다. 일례로서

:

if (%hash) { 
    print "Hash has elements\n"; 
} else { 
    print "Hash is empty\n"; 
} 

if 때문에 부울 식 등 그 사용의 상황에 스칼라 표현을 강제.

if (@array) { 
    # NOT empty! 
} 
+0

"비어있는"은 "키가 없습니다"를 의미합니다. – tchrist

+0

@tchrist - 설명을 추가했지만 "빈 해시"가 어떻게 해석 될 수 있는지에 대해서는 약간의 손실이 있습니다. – DVK

+3

'% h = (foo => undef)'가 스칼라와 다른 것을 의미하는지에 관계없이 모든 사람들이 이상하게 움직이는 원인이됩니다. 그들이 @a = (undef)를 통해 이상하게 움직이는 것과 같습니다. 유효한 값이 없더라도 유효한 인덱스가 하나씩 있습니다. 따라서 중요도는 중요합니다. – tchrist

1

스칼라 (% 해시) 해싱 알고리즘이 제대로 작동하는지 확인할 수 있습니다 :

그것은 공허함을 테스트하는 스칼라 문맥에서 @array를 사용하는 매우 유사한 개념이다. 만약 당신이 1,000 개의 키를 가지고 있고 2/16과 같은 것을 보게된다면 모든 키가 16 개의 할당 된 버킷 중 2 개만으로 해석된다는 것을 의미합니다. 즉, 모든 키가 매우 유사하고 충돌이 많이 발생하여 버킷에서 순차적 검색이 길어집니다.

기본 버킷 수는 8

perl -le '$h{a}=1;print scalar %h' 
1/8 

Prestash (2의 가장 가까운 전원) 1000 버킷 해시는 펄 OO에 대한 해시를 축복 할 때

perl -le 'keys(%h) = 1000;$h{a}=1;print scalar %h' 
1/1024 

이것은 또한 밖으로하는 데 도움이됩니다. 많은 키가 있다는 것을 안다면 속도를 높일 수 있습니다.