Perl 해시에서 스칼라 컨텍스트

때때로 일할 때 해시와 함께,당신이 볼 수있는 몇 가지 이상한 하나입니다.

여기에 샘플 프로그램:

#!/usr/bin/perl

my %h = (
    a => 1,
    b => 2,
);

print "hash: " . %h;

실행하는 경우 이 프로그램에서는 Perl5.22,이 프로그램의 출력이 될 것 텍스트 hash: 2/8.

이 부분입니까?

을 때 면 사용하는 운영자 포인트 는 해쉬에 사용되는 스칼라 context. print "hash: " . %h; 과 같 print "hash: " . scalar(%h);

문자열 2/8 는 식의 결과 scalar(%h).

문자열 2/8 에 대해 이야기 내부의 구조를 해시입니다. 이용 통계도 있습니다. 이것은 완전히 내장 부엌에 매우 거의 필요하지 않습니다. 내부에 해시에 할당된 특별한 단면도 버킷이라고있는 데이터가 저장됩니다. 에 기록되는 오른쪽의 일부분의 수 allochronic 버킷 등이 있습니다. 숫자의 왼쪽 부분은 숫자를 실제로 사용되는 버킷 등이 있습니다. 할 때 추가 값 쌍으로 해시의 일부 지점에서 allochronic 의 수는 버킷은 증가하는 해시 일 니다.

여기에 샘플 프로그램은 방법을 보여주는 이러한 수치를 변경할 때에 값을 추가하 hash:

#!/usr/bin/perl

use feature qw(say);

my %h;

foreach my $i (1 .. 17) {
    $h{$i} = $i;
    say "$i - " . scalar(%h);
}

여기에는 이 프로그램의 출력을(이하지 않는 모든 시간을 추가하는 값은 해시 증가 의 수는 버킷):

1 - 1/8
2 - 2/8
3 - 3/8
4 - 3/8
5 - 4/8
6 - 4/8
7 - 4/8
8 - 5/16
9 - 5/16
10 - 6/16
11 - 6/16
12 - 6/16
13 - 6/16
14 - 7/16
15 - 8/16
16 - 12/32
17 - 12/32

그것은 흥미로운 이러한 수치는 불안정합니다. 는 경우 반복적으로 실행하는 Perl 스크립트 출력이 다소 차이가있을 수 있습니다.

변화하는 작업을 시작에서는 Perl5.26

내부의 통계는 해시만 필요는 거의 없습니다. 따라서부터 시작,펄 버전 5.26,의 동작을 이 해시 에서 클라이언트로 변경 되었습니다. 지금 해시에서 스칼라 컨텍스트를 수를 반환합니다—-수의 쌍의 요소에서 해시입니다. 그리고 솔직히 무엇을 기대하는 것이 하나를 얻을에 액세스할 때는 해시에서 스칼라 context.

버전 5.26Perl 을 얻을 수의 쌍의 요소에서 해쉬를 쓰기 위해 필요한 scalar(keys(%h));. Perl5.26 지금 이번호를 사용하여 얻을 수있 scalar(%h);.

하지만 만약 누군가를 얻기 위해 필요한 부분에 대한 통계는 해시,그것은 가능한 한지를 사용하여 기능 bucket_ratio 라이브러리에서 Hash::Util. 여기에는 예의는 프로그램에서는 Perl 버전 5.26 는 텍스트가 표시됩 hash: 2/8.

#!/usr/bin/perl

use Hash::Util qw(bucket_ratio);

my %h = (
    a => 1,
    b => 2,
);

print "hash: " . bucket_ratio(%h);

추가적인 통계에는 해시

그렇다면,당신은 무슨 일이 일어나고 있는지 이해와 Chesham,그것을 가능하여 다른 도구를 사용하여. Perl5.22 라이브러리에서 Hash::Util 일 기능 등장 bucket_stats_formatted,여기에 예 그것의 사용:

#!/usr/bin/perl

use Hash::Util qw(bucket_stats_formatted);

my %h = (
    a => 1,
    b => 2,
);

print bucket_stats_formatted(\%h);

이 프로그램의 출력:

Keys: 2 Buckets: 2/8 Quality-Score: 0.94 (Good)
Utilized Buckets: 25.00% Optimal: 25.00% Keys In Collision: 0.00%
Chain Length - mean: 1.00 stddev: 0.00
Buckets              8 [00000011]
Len   0  75.00%      6 [######]
Len   1  25.00%      2 [##]
Keys                 2 [11]
Pos   1 100.00%      2 [##]

다른 기사