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将返回哈希值的大小。


Perl 教程
Perl 教程Perl 安装配置第一个 Perl 程序Perl 语法Perl 中的数据类型Perl 变量Perl 局部和全局变量Perl 中的标量Perl use strict和use warningsPerl 列表和数组Perl 中的哈希Perl 运算符Perl 中的条件语句Perl 中的if语句Perl 中的if-else语句perl 中的if-elsif-else语句Perl 中的unless语句Perl 中的unless-else语句Perl 中的 Switch CasePerl 中的 given-when-default 语句Perl 中的循环和循环控制语句Perl 中的 for 循环Perl while 循环Perl do-while 循环Perl foreach 循环Perl 中的until循环Perl 中的子程序Perl 字符串Perl 字符串转义序列Perl BarewordsPerl 比较文件的内容Perl 根据行号显示文件内容Perl 加密和解密Perl 错误处理Perl 格式Perl 函数签名Perl Hello World程序Perl 简介编写Perl代码的模式使用Perl的数字猜测游戏Perl 面向对象的编程(OOPs)Perl 包Perl abs()函数Perl 使用文件全局访问一个目录Perl Regex中的锚点Perl 向文件追加内容Perl 数组 pop() 函数Perl 数组切片Perl 数组 (push、pop、shift、unshift)Perl 数组Perl Regex中的断言Perl atan2() 函数Perl 自动加载(AUTOLOAD)功能Perl 字符串到数字的自动转换或铸造Perl 引用中的自生现象Perl 正则表达式中的回溯操作Perl Perl程序的基本语法Perl 布尔值Perl 调试器的中断点Perl CGI编程Perl chomp()函数Perl chop()函数Perl chr()函数Perl OOP中的类Perl cmp 操作符Perl 比较标量Perl 构造函数和析构函数Perl cos()函数Perl 计算文本中单词的频率Perl 创建Excel文件Perl 数据类型Perl 日期和时间Perl DBI(数据库独立接口)模块集Perl 分支 (if, if-else, Nested-if, if-elsif ladder, unless, unless-else, unless-elsif)Perl defined()函数Perl delete()函数Perl 带有CRUD操作的目录Perl 用调试器显示变量值Perl each() 函数Perl 正则表达式中的'e'修改器Perl 正则表达式中的'ee'修改器Perl OOPs中的封装Perl eq运算符Perl exists() 函数Perl 从脚本中退出Perl exp函数Perl 使用Regex从一个字符串中提取IP地址Perl 文件处理简介Perl 文件输入输出功能Perl 文件锁定Perl 文件测试运算符Perl CGI中的文件上传Perl 查找文件和目录Perl ge运算符Perl CGI中的GET与POSTPerl getc函数Perl 获取一个数组的元素数Perl given-when 语句Perl glob()函数Perl goto 语句Perl grep()函数Perl Regex中的分组和交替法Perl gt运算符Perl 标量和列表背景下的哈希值Perl 哈希操作Perl HashPerl 哈希值Perl hex函数Perl 实现一个队列Perl 实现一个堆栈Perl index() 函数Perl OOPs中的继承性Perl 在Windows、Linux和MacOS中的安装和环境设置Perl int()函数Perl join()函数Perl keys() 函数Perl 循环中的lastPerl lc()函数用于小写转换Perl lcfirst()函数Perl le运算符Perl length()函数Perl 调试器中的行操作命令Perl 列表及其类型Perl 列表的上下文敏感度Perl 列表函数Perl log() 函数Perl 循环 for, foreach, while, do...while, until, 嵌套循环Perl lt运算符Perl 匹配运算符
Perl 基础教程
Perl 简介Perl 环境安装Perl 基础语法Perl 数据类型Perl 变量Perl 标量Perl 数组Perl 哈希Perl 条件语句Perl 循环Perl 运算符Perl 时间日期Perl 子程序(函数)Perl 引用Perl 格式化输出Perl 文件操作Perl 目录操作Perl 错误处理Perl 特殊变量Perl 正则表达式Perl Socket 编程Perl 面向对象Perl 包和模块Perl 进程管理Perl POD 文档Perl while 循环Perl until 循环Perl for 循环Perl foreach 循环Perl do…while 循环Perl 循环嵌套Perl next 语句Perl last 语句Perl continue 语句Perl redo 语句Perl goto 语句Perl IF 语句Perl IF…ELSE 语句Perl IF…ELSIF 语句Perl UNLESS 语句Perl UNLESS…ELSE 语句Perl UNLESS…ELSIF 语句Perl switch 语句
Perl 问答
Perl 和 Ruby 的区别