ZetCode

Perl 哈希

最后修改于 2023 年 8 月 24 日

Perl 哈希教程演示了如何在 Perl 中使用哈希。

哈希是一种标量关联数组。它是一组键/值对。每个值由其键唯一标识。

哈希是一种基本的 Perl 数据类型。数据类型是一组值以及可以对这些值进行的操作。

在 C# 或 Python 等其他编程语言中,哈希通常称为字典。

Perl 使用 % 符号来定义哈希。

my %words = (0=>'sky', 1=>'tommorrow', 2=>'blue', 3=>'pink',
     4=>'work', 5=>'forest');

可以使用 => 字符在字面哈希声明中分隔键和值。

Perl 简单哈希

在下面的示例中,我们处理一个简单的哈希。

simple.pl
#!/usr/bin/perl

use warnings;
use 5.30.0;

my %words = (0=>'sky', 1=>'tommorrow', 2=>'blue', 3=>'pink',
     4=>'work', 5=>'forest');

say $words{0};
say $words{1};
say $words{5};

say '-----------------';

say map { "$_ $words{$_}\n" } keys %words;

say '-----------------';

$, = ' ';
my @keys = keys %words;
my @values = values %words;

say @keys;
say @values;

在示例中,我们定义了一个单词哈希。我们打印单个值、键/值对以及哈希的键和值。

my %words = (0=>'sky', 1=>'tommorrow', 2=>'blue', 3=>'pink',
     4=>'work', 5=>'forest');

定义了一个 Perl 单词哈希。该哈希使用 % 字符。

say $words{0};

我们打印存储在键 0 下的值。当我们引用哈希的单个值时,我们使用 $ 符号和一对花括号 {}

say map { "$_ $words{$_}\n" } keys %words;

使用 map 函数,我们打印哈希的所有键/值对。

my @keys = keys %words;

使用 keys 函数,我们获取哈希的键。

my @values = values %words;

使用 values 函数,我们获取哈希的值。

$ ./simple.pl 
sky
tommorrow
forest
-----------------
2 blue
4 work
3 pink
5 forest
0 sky
1 tommorrow

-----------------
2 4 3 5 0 1
blue work pink forest sky tommorrow

Perl 哈希大小

在下面的示例中,我们确定哈希的大小。

hash_size.pl
#!/usr/bin/perl

use warnings;
use 5.30.0;

my %words = (0=>'sky', 1=>'tommorrow', 2=>'blue', 3=>'pink',
     4=>'work', 5=>'forest');

my $n = keys %words;

say "the hash has $n items";

要获取哈希的大小,我们在标量上下文中使用了 keys 函数。

$ ./hash_size.pl 
the hash has 6 items

Perl 添加和删除元素

在下一个示例中,我们展示了如何在哈希中添加和删除元素。

add_remove.pl
#!/usr/bin/perl

use warnings;
use 5.30.0;
use Data::Dumper;

my %words = ();

$words{0} = 'sky';
$words{1} = 'rock';
$words{2} = 'bed';

say Dumper(\%words);

delete $words{2};

say '---------------------';

say Dumper(\%words);

%words = ();

say '---------------------';

say Dumper(\%words);

首先,我们初始化一个空哈希。我们向哈希中添加三个键值对,删除一个键值对,最后清空哈希。我们使用 Data::Dumper 显示哈希的内容。

my %words = ();

初始化了一个空哈希。

$words{0} = 'sky';
$words{1} = 'rock';
$words{2} = 'bed';

我们向哈希中添加了三个键/值对。

delete $words{2};

使用 delete 函数删除一个键值对。

%words = ();

我们清空了哈希。

$ ./add_remove.pl 
$VAR1 = {
          '2' => 'bed',
          '1' => 'rock',
          '0' => 'sky'
        };

---------------------
$VAR1 = {
          '1' => 'rock',
          '0' => 'sky'
        };

---------------------
$VAR1 = {};

Perl 哈希迭代

我们可以使用 forforeach 关键字迭代哈希项。

iterate.pl
#!/usr/bin/perl

use warnings;
use 5.30.0;

my %words = (0=>'sky', 1=>'tommorrow', 2=>'blue', 3=>'pink',
     4=>'work', 5=>'forest');

foreach my $v (values %words){
    say $v;
}

say '----------------';

foreach my $k (keys %words){
    say $k;
}

say '----------------';

for (keys %words) {

     print("$_: $words{$_}\n");
}

在示例中,我们迭代了一个单词哈希。

$ ./iterate.pl 
blue
sky
pink
tommorrow
work
forest
----------------
2
0
3
1
4
5
----------------
2: blue
0: sky
3: pink
1: tommorrow
4: work
5: forest

Perl 哈希排序

使用 sort 函数,我们可以按键或值对哈希项进行排序。默认情况下,哈希项是无序的。

sorting.pl
#!/usr/bin/perl

use warnings;
use 5.30.0;

my %words = (0=>'sky', 1=>'tommorrow', 2=>'blue', 3=>'pink',
     4=>'work', 5=>'forest');

foreach my $v (sort values %words){
    say $v;
}

say '----------------';

foreach my $v (reverse sort values %words){
    say $v;
}

say '----------------';

foreach my $k (sort keys %words){
    say $k;
}

say '----------------';

foreach my $k (reverse sort keys %words){
    say $k;
}

在示例中,我们使用 sortreverse 函数按升序和降序对哈希的键和值进行排序。

$ ./sorting.pl 
blue
forest
pink
sky
tommorrow
work
----------------
work
tommorrow
sky
pink
forest
blue
----------------
0
1
2
3
4
5
----------------
5
4
3
2
1
0

Perl 比较哈希

使用 Data::Compare 模块,我们可以比较 Perl 数据结构。

comparing.pl
#!/usr/bin/perl

use warnings;
use 5.30.0;
use Data::Compare;

my %h1 = ( 
    0 => ('a', 'b', 'c'), 
    1 => ('d', 'e', 'f'), 
);

my %h2 = ( 
    0 => ('a', 'b', 'c'), 
    1 => ('d', 'e', 'f'), 
);

if (Compare(\%h1, \%h2)) {

    say 'the two hashes are equal';
} else {
    
    say 'the two hashes are not equal';
}

该示例使用 Data::Compare 比较了两个哈希。

if (Compare(\%h1, \%h2)) {

Compare 函数接受两个哈希引用作为参数。

$ ./comparing.pl 
the two hashes are equal

Perl 哈希切片

可以从哈希中提取值列表。

hash_slice.pl
#!/usr/bin/perl

use warnings;
use 5.30.0;

my %words = (0=>'sky', 1=>'cup', 2=>'blue', 3=>'pink',
    4=>'work', 5=>'forest');

my ($first, $second) = @words{(0, 1)};

say $first;
say $second;

在示例中,我们从单词列表中提取了两个单词。

my ($first, $second) = @words{(0, 1)};

我们使用 @ 符号来获取切片。

$ ./hash_slice.pl 
sky
cup

在本文中,我们学习了 Perl 中的哈希数据类型。

作者

我叫 Jan Bodnar,我是一名充满激情的程序员,拥有丰富的编程经验。我从 2007 年开始撰写编程文章。到目前为止,我已撰写了 1400 多篇文章和 8 本电子书。我在教学编程方面拥有十多年的经验。

列出 所有 Perl 教程