珀尔 |标量和列表上下文中的散列
- 先决条件: Perl 哈希
Perl 中的哈希是一组键/值对。 Perl 为我们提供了将哈希分配给List类型和Scalar类型的灵活性,分别称为 LIST Context 和 SCALAR Context。
- 在 Perl 的 List 上下文中,运算符可用于获取所提供范围之间的多个值。
例子:@hundred = (0..100);
上面的例子如果放入 print 语句将导致打印从 0 到 100 的数字范围。
- 使用 List Context 可以轻松地按其键或值对哈希进行排序。将散列转换为其键或值的列表后,对该列表进行排序,然后按排序顺序存储相应的键或值。
- 我们也可以使用 hash 的 List Context ,我们希望只在 hash 非空时执行一段代码,即 hash 的大小不为 0。
句法@keys = keys %hash;
if (@keys)
{
….Code….
}
LIST 上下文中的哈希
在 Perl 中将散列分配给列表类型是通过创建一个以键和值作为其元素的列表来完成的。当散列在 LIST 上下文中时,Perl 将散列转换为交替值的列表。原始哈希中的每个键值对将成为新创建的列表中的两个值。
Syntax :
my @list = %hash;
关于这个结果列表的一个有趣的事实是,对于每一对,键都在前,值在后。
例子
# !/usr/bin/perl
# Perl program to demonstrate
# List Context of hash
use strict;
use warnings;
use 5.010;
use Data::Dumper qw(Dumper);
# Creating a Hash
my %hash = ('MyVehicle' => 'Car',
'Model' => 1234,
'Speed' => 60.7,
'Red' => 'Stop',
'Yellow' => 'Look and move',
'Green' => 'Go'
);
# Assign hash to a list context
my @list = %hash;
# Print the List
say Dumper \@list;
$VAR1 = [
'Yellow',
'Look and move',
'Green',
'Go',
'Speed',
'60.7',
'MyVehicle',
'Car',
'Red',
'Stop',
'Model',
1234
];
在这里,我们可以看到散列的每个值都放在列表中对应的键之后。但是这些对将被放置在列表中的顺序没有定义。
Data::Dumper用于序列化哈希和列表。该模块提供了将数据结构(包括对象)解析为字符串格式的方法,该格式可用于“转储”数据以进行打印和进行评估,以便可以使用eval将转储的结构重构为有效的内部结构.
主要函数Dumper接受对数据结构或对象的标量引用列表。返回值是结构的字符串表示形式,以正常字符串语法格式生成。
例子
# !/usr/bin/perl
# Perl program to demonstrate
# Use of Data::Dumper
use Data::Dumper;
my $ref = { 'MyVehicle' => 'Car',
'Model' => 1234,
'Speed' => 60.7,
'Red' => 'Stop',
'Yellow' => 'Look and move',
'Green' => 'Go'
};
print Dumper($ref);
$VAR1 = {
'Yellow' => 'Look and move',
'Red' => 'Stop',
'MyVehicle' => 'Car',
'Green' => 'Go',
'Speed' => '60.7',
'Model' => 1234
};
散列中 LIST Context 的使用:
- 散列的标量上下文有助于确定散列是否为空。如果哈希返回 0
是空的。my $list = %hash;
if ($list)
{
….Code….
}如果哈希值非空,则执行if条件。
- 它有助于找出 Perl 的内部散列算法是否在我们的数据集上表现不佳。
例如,
我们将 10 个东西放在一个散列中,但在标量上下文中评估 %HASH 会显示“1/16”,这意味着 16 个桶中只有一个被触及,并且可能包含所有 10 个项目。这不应该发生。 - 我们还可以通过使用标量上下文来获取大小 - 即哈希中的元素数量
键或值。句法
@keys = keys %hash;
$size = @keys;在这里, $size将返回散列的大小。
SCALAR 上下文中的散列
在 Perl 中将散列分配给标量类型实际上会给出一些表示散列内部布局的内部数字。返回类型是描述散列的当前存储统计信息的字符串。这是
报告为“已用/总”存储桶。存储桶是您的哈希信息的存储容器。
获得的字符串看起来像一个分数,可以评估为:
The denominator of the fraction is the total number of buckets.
The numerator of the fraction is the number of buckets which has one or more elements.
Syntax :
my $list = %hash;
例子
# !/usr/bin/perl
# Perl program to demonstrate
# Scalar Context of hash
# Creating a Hash
my %hash = (
'MyVehicle' => 'Car',
'Model' => 1234,
'Speed' => 60.7,
'Red' => 'Stop',
'Yellow' => 'Look and move',
'Green' => 'Go'
);
# Assign hash to a Scalar Context
my $list = %hash;
# Print the List
print $list;
5/8
在上面的输出中,哈希中总共有 6 个桶(所有键/值对),因此分配的总数
buckets 将是2 > total keys 的最低幂,用于完全容纳所有桶,因此分母为 8。
虽然分子完全取决于内部算法,因为它会根据散列存储属性不断改变其值。
但是,一旦散列分配了它的桶,即使我们缩小散列,它们也将保持分配状态。
注意:对于具有相同数量元素的哈希,数字越大越好。返回 6/8 的冲突比返回 4/8 的冲突少。
散列中 SCALAR 上下文的使用: