Perl hash i skalar sammenhæng

Nogle gange, når du arbejder med hashes, kan du se nogle mærkelige fraktioner.

Her er en prøve på programmet:

#!/usr/bin/perl

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

print "hash: " . %h;

Hvis du kører dette program på Perl 5.22, produktionen af dette program vil være tekst hash: 2/8.

Hvad er denne fraktion?

Når du bruger operatøren punkt hash bruges i skalar sammenhæng. print "hash: " . %h; er den samme som print "hash: " . scalar(%h);

String 2/8 er resultatet af udtrykket scalar(%h).

String 2/8 taler om den indre struktur af hash. Denne statistik spande. Dette er en fuldstændig intern køkken, hvilket er meget sjældent nødvendigt. Inde hash afsat særlige sektioner kaldes spande, hvor data er gemt. Hvad der er skrevet til højre for den fraktion, der er antallet af allochronic spande. Tallet til venstre for den fraktion, er antallet faktisk bruges spande. Når du tilføjer værdi-par i en hash på et tidspunkt allochronic antallet af enheder er steget til hash arbejdet effektivt.

Her er en prøve-program, der viser, hvordan disse tal ændrer sig, når at tilføje værdier til en hash:

#!/usr/bin/perl

use feature qw(say);

my %h;

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

Her er resultatet af dette program (bemærk, at det ikke hver gang, du tilføjer en værdi i hash øger antallet af enheder):

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

Det er interessant, at disse tal er ustabile. Hvis du gentagne gange køre dette Perl-script, vil output være lidt anderledes.

Skiftende arbejde startende fra Perl 5.26

Den interne statistikker for den hash, der er nødvendige for kun sjældent. Derfor starter fra Perl version 5.26, adfærd hash i skalar sammenhæng blev ændret. Nu hash i skalar sammenhæng returnerer et tal, er antallet af par af elementer i hash. Og helt ærligt, det er hvad man ville forvente at få, når du får adgang til en hash i skalar sammenhæng.

Til version 5.26 Perl til at få antallet af par af elementer i den hash, der er nødvendige for at skrive scalar(keys(%h));. Perl er 5,26 nu dette nummer kan opnås ved brug af scalar(%h);.

Men hvis nogen har brug for at få en brøkdel med statistikker for den hash, det er muligt at gøre brug funktion bucket_ratio fra biblioteket Hash::Util. Her er et eksempel på et program, der på Perl version 5.26 viser tekst hash: 2/8.

#!/usr/bin/perl

use Hash::Util qw(bucket_ratio);

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

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

Yderligere statistik på hash

Hvis det er tilfældet, er du nødt til at forstå, hvad der sker med Chesham, det er muligt at bruge andre værktøjer. Fra Perl 5.22 i biblioteket Hash::Util funktion dukkede op bucket_stats_formatted, her er et eksempel dets brug:

#!/usr/bin/perl

use Hash::Util qw(bucket_stats_formatted);

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

print bucket_stats_formatted(\%h);

Produktionen af dette program:

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 [##]

Andre artikler