Perl - 哈希
哈希是一组 key/value 对。 哈希变量前面有一个百分号 (%)。 要引用散列的单个元素,您将使用散列变量名称,前面带有"$"符号,后跟与花括号中的值关联的"键"。
这是一个使用哈希变量的简单示例 −
#!/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
检查存在
如果您尝试从不存在的哈希中访问键/值对,您通常会得到 undefined 值,如果您打开了警告,那么您将 在运行时生成警告。 您可以通过使用 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 ) 部分仅在给定条件为真时执行,否则 else 部分将被执行。 因此,当我们执行上述程序时,它会产生以下结果,因为这里给定条件 exists($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
在哈希中添加和删除元素
使用简单的赋值运算符,只需一行代码即可添加新的键/值对。 但是要从哈希中删除一个元素,您需要使用 delete 函数,如下例所示 −
#!/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