Perl - 哈希


哈希是一组键/值对。哈希变量前面有一个百分号 (%)。要引用散列的单个元素,您将使用散列变量名称,前面带有“$”符号,后跟与大括号中的值关联的“key”。

这是使用哈希变量的简单示例 -

#!/usr/bin/perl

%data = ('John Paul', 45, 'Lisa', 30, 'Kumar', 40);

print "\$data{'John Paul'} = $data{'John Paul'}\n";
print "\$data{'Lisa'} = $data{'Lisa'}\n";
print "\$data{'Kumar'} = $data{'Kumar'}\n";

这将产生以下结果 -

$data{'John Paul'} = 45
$data{'Lisa'} = 30
$data{'Kumar'} = 40

创建哈希

哈希值是通过以下两种方式之一创建的。在第一种方法中,您将一个值一对一地分配给命名键 -

$data{'John Paul'} = 45;
$data{'Lisa'} = 30;
$data{'Kumar'} = 40;

在第二种情况下,您使用一个列表,该列表通过从列表中获取各个对进行转换:该对的第一个元素用作键,第二个元素用作值。例如 -

%data = ('John Paul', 45, 'Lisa', 30, 'Kumar', 40);

为了清楚起见,您可以使用 => 作为 的别名,以指示键/值对,如下所示 -

%data = ('John Paul' => 45, 'Lisa' => 30, 'Kumar' => 40);

这是上述形式的另一种变体,看一下,这里所有的键前面都有连字符 (-),并且不需要在它们周围加上引号 -

%data = (-JohnPaul => 45, -Lisa => 30, -Kumar => 40);

但重要的是要注意,有一个单词,即,没有空格键已用于这种形式的哈希形成,如果您以这种方式构建哈希,则将仅使用连字符来访问键,如下所示。

$val = %data{-JohnPaul}
$val = %data{-Lisa}

访问哈希元素

从散列访问各个元素时,必须在变量前添加美元符号 ($),然后将元素键附加在变量名称后面的大括号内。例如 -

#!/usr/bin/perl

%data = ('John Paul' => 45, 'Lisa' => 30, 'Kumar' => 40);

print "$data{'John Paul'}\n";
print "$data{'Lisa'}\n";
print "$data{'Kumar'}\n";

这将产生以下结果 -

45
30
40

提取切片

您可以提取哈希的切片,就像从数组中提取切片一样。您将需要使用 @ 前缀作为变量来存储返回的值,因为它们将是值列表 -

#!/uer/bin/perl


%data = (-JohnPaul => 45, -Lisa => 30, -Kumar => 40);

@array = @data{-JohnPaul, -Lisa};

print "Array : @array\n";

这将产生以下结果 -

Array : 45 30

提取键和值

您可以使用keys函数从哈希中获取所有键的列表,该函数具有以下语法 -

keys %HASH

该函数返回指定哈希的所有键的数组。以下是示例 -

#!/usr/bin/perl 

%data = ('John Paul' => 45, 'Lisa' => 30, 'Kumar' => 40);

@names = keys %data;

print "$names[0]\n";
print "$names[1]\n";
print "$names[2]\n";

这将产生以下结果 -

Lisa
John Paul
Kumar

同样,您可以使用values函数来获取所有值的列表。该函数具有以下语法 -

values %HASH

该函数返回一个由指定哈希的所有值组成的普通数组。以下是示例 -

#!/usr/bin/perl 

%data = ('John Paul' => 45, 'Lisa' => 30, 'Kumar' => 40);

@ages = values %data;

print "$ages[0]\n";
print "$ages[1]\n";
print "$ages[2]\n";

这将产生以下结果 -

30
45
40

检查是否存在

如果您尝试从不存在的哈希访问键/值对,您通常会得到未定义的值,如果您打开了警告,那么您将收到运行时生成的警告。您可以通过使用exists函数来解决这个问题,如果指定的键存在,则该函数返回true,无论其值是什么 -

#!/usr/bin/perl

%data = ('John Paul' => 45, 'Lisa' => 30, 'Kumar' => 40);

if( exists($data{'Lisa'} ) ) {
   print "Lisa is $data{'Lisa'} years old\n";
} else {
   print "I don't know age of Lisa\n";
}

这里我们介绍了 IF...ELSE 语句,我们将在单独的章节中研究它。现在,您假设if(condition)部分仅在给定条件为 true 时才会执行,否则会执行else部分。因此,当我们执行上面的程序时,它会产生以下结果,因为这里给定的条件存在($data{'Lisa'}返回 true -

Lisa is 30 years old

获取哈希大小

您可以通过使用键或值上的标量上下文来获取大小,即哈希中的元素数量。简而言之,首先您必须获取键或值的数组,然后您可以获得数组的大小,如下所示 -

#!/usr/bin/perl

%data = ('John Paul' => 45, 'Lisa' => 30, 'Kumar' => 40);

@keys = keys %data;
$size = @keys;
print "1 - Hash size:  is $size\n";

@values = values %data;
$size = @values;
print "2 - Hash size:  is $size\n";

这将产生以下结果 -

1 - Hash size: is 3
2 - Hash size: is 3

添加和删​​除哈希中的元素

添加新的键/值对可以使用简单的赋值运算符通过一行代码来完成。但是要从哈希中删除元素,您需要使用删除函数,如下例所示 -

#!/usr/bin/perl

%data = ('John Paul' => 45, 'Lisa' => 30, 'Kumar' => 40);
@keys = keys %data;
$size = @keys;
print "1 - Hash size:  is $size\n";

# adding an element to the hash;
$data{'Ali'} = 55;
@keys = keys %data;
$size = @keys;
print "2 - Hash size:  is $size\n";

# delete the same element from the hash;
delete $data{'Ali'};
@keys = keys %data;
$size = @keys;
print "3 - Hash size:  is $size\n";

这将产生以下结果 -

1 - Hash size: is 3
2 - Hash size: is 4
3 - Hash size: is 3