Perl 标量和列表背景下的哈希值

Perl 标量和列表背景下的哈希值

Perl中的 哈希 是一组键/值对。Perl为我们提供了灵活性,可以将哈希分配给一个 List 类型和一个 Scalar 类型,分别称为LIST Context和SCALAR Context。

LIST上下文中的哈希值

在Perl中,将散列分配给一个列表类型是通过建立一个以键和值为元素的列表来完成的。当哈希在LIST上下文中时,Perl将哈希转换为一个交替取值的列表。原有散列中的每个键值对都将成为新创建的列表中的两个值。

语法 :

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上下文在哈希中的用途:

  1. 在Perl的List上下文中,该操作符可以用来获取所提供范围内的多个值。

示例:

@hundred = (0..100);

上面的例子如果放到打印语句中,将导致打印出一个从0到100的数字范围。

  1. 使用List Context可以很容易地完成按键或值对散列的排序。在将散列转换为键或值的列表后,对该列表进行排序,然后按照排序的顺序存储相应的键或值。

  2. 我们也可以使用哈希的列表上下文,只有当哈希不为空时,即哈希的大小不为0时,我们才想执行一段代码。

语法

@keys = keys %hash;   
 if (@keys)   
 {   
 ….Code….   
 } 

哈希在SCALAR上下文中

在Perl中,将一个哈希赋值给一个标量类型,实际上会给出一些内部数字,代表哈希的内部布局。返回类型是字符串,描述了散列的当前存储统计。这将是
报告为“已用/总 “桶。这些桶是你的哈希信息的存储容器。

获得的字符串看起来像一个分数,可以被评估为。
分数的分母是桶的总数。
分数的分子是有个或更多元素的桶的数量。

语法 :

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
printlist;

输出:

5/8

在上面的输出中,哈希中总共有6个桶(所有的键/值对),因此,分配的总桶数将是2的最小次幂>总键数,以充分容纳所有的桶。
桶将是2的最小幂>总键数,以充分容纳所有的桶,因此分母是8。
而分子则完全取决于内部算法,因为它不断改变其值,这取决于散列的存储属性。
然而,一旦散列分配了它的桶,即使我们缩小了散列,它们也会保持分配。

注意:对于具有相同数量元素的散列,数字越大越好。返回6/8的那个比返回4/8的那个碰撞少。

SCALAR上下文在哈希中的用途:

  1. 散列的Scalar上下文有助于确定该散列是否为空。如果散列是空的,它返回0。 是空的。
my list = %hash;   if (list)   
 {   
 ….Code….   
 } 

如果哈希值不是空的,if条件将被执行。

  1. 它有助于发现Perl的内部散列算法在我们的数据集上是否表现不佳。

**例如:***,

我们在散列中放置了10个东西,但是在标量上下文中评估%HASH显示为 “1/16″,这意味着16个桶中只有一个被触及,并且可能包含了你所有的10个项目。这种情况是不应该发生的。

  1. 我们还可以通过在键或值上使用标量上下文来获得大小–也就是散列中的元素数量。 键或值的标量上下文。

语法

@keys = keys %hash;   
$size = @keys; 

这里,$size将返回哈希值的大小。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程