Perl哈希%hash

哈希是 key/value 键/值对的集合。

Perl中哈希变量以百分号 (%) 标记开始。

访问哈希元素格式:${key}

以下是一个简单的哈希实例:

实例

#!/usr/bin/perl

%data = (‘google‘, ‘google.com‘, ‘runoob‘, ‘runoob.com‘, ‘taobao‘, ‘taobao.com‘);

print "\$data{‘google‘} = $data{‘google‘}\n";

print "\$data{‘runoob‘} = $data{‘runoob‘}\n";

print "\$data{‘taobao‘} = $data{‘taobao‘}\n";

执行以上程序,输出结果为:


创建哈希

创建哈希可以通过以下两种方式:

一、为每个 key 设置 value

$data{‘google‘} = ‘google.com‘;
$data{‘runoob‘} = ‘runoob.com‘;
$data{‘taobao‘} = ‘taobao.com‘;

二、通过列表设置

列表中第一个元素为 key,第二个为 value。

%data = (‘google‘, ‘google.com‘, ‘runoob‘, ‘runoob.com‘, ‘taobao‘, ‘taobao.com‘);

也可以使用 => 符号来设置 key/value:

%data = (‘google‘=>‘google.com‘, ‘runoob‘=>‘runoob.com‘, ‘taobao‘=>‘taobao.com‘);

以下实例是上面实例的变种,使用 - 来代替引号:

%data = (-google=>‘google.com‘, -runoob=>‘runoob.com‘, -taobao=>‘taobao.com‘);

使用这种方式 key 不能出现空格,读取元素方式为:

$val = $data{-google}
$val = $data{-runoob}

访问哈希元素

访问哈希元素格式:${key},实例如下:

实例

#!/usr/bin/perl

%data = (‘google‘=>‘google.com‘, ‘runoob‘=>‘runoob.com‘, ‘taobao‘=>‘taobao.com‘);

print "\$data{‘google‘} = $data{‘google‘}\n";

print "\$data{‘runoob‘} = $data{‘runoob‘}\n";

print "\$data{‘taobao‘} = $data{‘taobao‘}\n";

执行以上程序,输出结果为:


读取哈希值

你可以像数组一样从哈希中提取值。

哈希值提取到数组语法格式:@{key1,key2}

实例

#!/uer/bin/perl

%data = (-taobao => 45, -google => 30, -runoob => 40);

@array = @data{-taobao, -runoob};

print "Array : @array\n";

执行以上程序,输出结果为:

Array : 45 40

读取哈希的 key 和 value

读取所有key

我们可以使用 keys 函数读取哈希所有的键,语法格式如下:

keys %HASH

该函数返回所有哈希的所有 key 的数组。

实例

#!/usr/bin/perl

%data = (‘google‘=>‘google.com‘, ‘runoob‘=>‘runoob.com‘, ‘taobao‘=>‘taobao.com‘);

@names = keys %data;

print "$names[0]\n";

print "$names[1]\n";

print "$names[2]\n";

执行以上程序,输出结果为:

taobao
google
runoob

类似的我们可以使用 values 函数来读取哈希所有的值,语法格式如下:

values %HASH

该函数返回所有哈希的所有 value 的数组。

实例

#!/usr/bin/perl

%data = (‘google‘=>‘google.com‘, ‘runoob‘=>‘runoob.com‘, ‘taobao‘=>‘taobao.com‘);

@urls = values %data;

print "$urls[0]\n";

print "$urls[1]\n";

print "$urls[2]\n";

执行以上程序,输出结果为:

taobao.com
runoob.com
google.com

检测元素是否存在

如果你在哈希中读取不存在的 key/value 对 ,会返回 undefined 值,且在执行时会有警告提醒。

为了避免这种情况,我们可以使用 exists 函数来判断key是否存在,存在的时候读取:

实例

#!/usr/bin/perl

%data = (‘google‘=>‘google.com‘, ‘runoob‘=>‘runoob.com‘, ‘taobao‘=>‘taobao.com‘);

if( exists($data{‘facebook‘} ) ){

  print "facebook 的网址为 $data{‘facebook‘} \n";

} else {

  print "facebook 键不存在\n";

}

执行以上程序,输出结果为:

facebook 键不存在

以上代码中我们使用了 IF...ELSE 语句,在后面的章节我们会具体介绍。


获取哈希大小

哈希大小为元素的个数,我们可以通过先获取 key 或 value 的所有元素数组,再计算数组元素多少来获取哈希的大小,实例如下:

实例

#!/usr/bin/perl

%data = (‘google‘=>‘google.com‘, ‘runoob‘=>‘runoob.com‘, ‘taobao‘=>‘taobao.com‘);

@keys = keys %data;

$size = @keys;

print "1 - 哈希大小: $size\n";

@values = values %data;

$size = @values;

print "2 - 哈希大小: $size\n";

执行以上程序,输出结果为:

1 - 哈希大小: 3
2 - 哈希大小: 3

哈希中添加或删除元素

添加 key/value 对可以通过简单的赋值来完成。但是删除哈希元素你需要使用 delete 函数:

实例

#!/usr/bin/perl

%data = (‘google‘=>‘google.com‘, ‘runoob‘=>‘runoob.com‘, ‘taobao‘=>‘taobao.com‘);

@keys = keys %data;

$size = @keys;

print "1 - 哈希大小: $size\n";

$data{‘facebook‘} = ‘facebook.com‘;   # 添加元素

@keys = keys %data;

$size = @keys;

print "2 - 哈希大小: $size\n";

delete $data{‘taobao‘};    # 删除哈希中的元素

@keys = keys %data;

$size = @keys;

print "3 - 哈希大小: $size\n";

执行以上程序,输出结果为:

1 - 哈希大小: 3
2 - 哈希大小: 4
3 - 哈希大小: 3

自己常用哈希方法总结:


二维哈希:使用$hash{$key1}{$key2}=$value;

遍历:

foreach my $key1(sort keys %hash){    #首先对key1进行排序

  foreach my $key2(sort {$hash{$key1}->{$b}<=>$hash{$key1}->{$a}}  keys  %{$hash{$key1}}){      #对value值按照数字大小进行逆序排序

   #foreach my $key2(sort {$a<=>$b}  keys %{$hash{$key1}}){                                                              #对key2按照数字大小进行排序,正顺序排序

    print $key1."t".$key2."t".$hash{$key1}->{$key2}."n";

  }

}

一维哈希:

foreach my $key(sort {$hash{$b}<=>$hash{$a}}  keys %hash){      #对value值按照数字大小进行逆序排序

  print $key."t".$hash{$key}."n";

}

    

参考https://www.runoob.com/perl/perl-hashes.html



原文地址:https://www.cnblogs.com/Formulate0303/p/11224993.html

时间: 2024-11-09 04:44:25

Perl哈希%hash的相关文章

Perl 哈希、数组 排序

写在前面: 1. 注意use warnings; 后,定义变量前加my 2. 此文转载其他文章,代码修改,适合新版本perl (一) sort函数sort LISTsort BLOCK LISTsort SUBNAME LISTsort的用法有如上3种形式.它对LIST进行排序,并返回排序后的列表.假如忽略了SUBNAME或BLOCK,sort按标准字串比较顺序来进行(例如ASCII顺序).如果指定了SUBNAME,它实际上是个子函数的名字,该子函数对比2个列表元素,并返回一个小于,等于,或大于

Perl Learning 5 Hash

[本文原创,未经允许请勿转载] 哈希是一种数据结构,它和数组的相似之处在于可以容纳任意多的值并能按需取用,而它和数组的不同在于索引方式,数组是以数字来索引,哈希则以名字来索引.也就是说,哈希的索引值,此处称为键(key),并不是数字,而是任意唯一的字符串.但它也必须是唯一的字符串. 我们也可以这么看待哈希,试将它想象成一大桶数据,其中每个数据都有关联的标签.你可以伸手到桶里任意取出一张标签,看它上面附着的数据是什么.但是桶里没有所谓的"第一个"元素,只有一堆数据.是键-值对的集合. 要

大话Java中的哈希(hash)结构(一)

o( ̄▽ ̄)d 小伙伴们在上网或者搞程序设计的时候,总是会听到关于“哈希(hash)”的一些东西.比如哈希算法.哈希表等等的名词,那么什么是hash呢? 一.相关概念 1.hash算法:一类特殊的算法(注意哦,hash算法并不是某个固定的算法,而是一类特殊功能算法的统称). 2.哈希表(hash table).哈希映射(hash map).哈希集合(hash set):一种基于hash算法的数据结构. 3.哈希函数:在hash算法中的核心函数. 4.map:译为“映射”,是一种从键(key)到值

NSDictionary实现原理-ios哈希hash和isEqual

NSDictionary实现原理-ios哈希hash和isEqual OC中自定义类的NSCopying实现的注意事项(isEqual & hash实现) http://blog.csdn.net/linshaolie/article/details/41494303 iOS开发 之 不要告诉我你真的懂isEqual与hash! http://m.blog.csdn.net/hx_lei/article/details/53885798 http://www.jianshu.com/p/9153

perl 函数返回hash引用

perl 函数返回hash引用 my %h=%{foo()} #接收hash sub foo{ my %fh; $fh{a}=1; return \%fh;      #返回hash引用 } grep?? 在hash中,当检验一个元素值是否被定义是用defined,当检验一个key在hash中是否存在时,用exists. if(defined $hash{$key}){...} if(exists $hash{$key}){...} 正则匹配时,=~之间不能有空格!!! 一个句柄可以多次使用,但

Redis 命令-哈希(Hash)

Redis 哈希(Hash) Redis hash 是一个 string 类型的 field 和 value 的映射表,hash 特别适合用于存储对象. Redis 中每个 hash 可以存储 232 - 1 键值对(40多亿). 注:未避免大key,最多不要超过5000个键值对. 实例 127.0.0.1:6379> HMSET runoobkey name "redis tutorial" description "redis basic commands for

哈希Hash在字符串中的应用_C++

本文含有原创题,涉及版权利益问题,严禁转载,违者追究法律责任 哈希大家都会用撒,字符串显然都会写撒,那么哈希离散化字符串不就懂了?!(XXX的神逻辑,其实原文是:树都晓得吧,数组显然都会开呀,那么恭喜你学会了树状数组!) 例如我们给出 n 个长度为 m 的字符串,然后给你一个长度为 m 的字符串 s ,求 s 是否在之前的 n 个串中出现过 暴力扫 n 个串,然后一位位去对,看是否相等,时间复杂度O(nm),它非常得辣鸡 当然我们可以建一颗 trie 树做,但是建树的复杂度也是O(nm)的,对于

Redis 哈希(Hash)

Redis hash 是一个string类型的field和value的映射表,hash特别适合用于存储对象. Redis 中每个 hash 可以存储 232 - 1 键值对(40多亿). 实例 redis 127.0.0.1:6379> HMSET w3ckey name "redis tutorial" description "redis basic commands for caching" likes 20 visitors 23000 OK redi

哈希(Hash)与加密(Encrypt)的基本原理、区别及工程应用

0.摘要 今天看到吉日嘎拉的一篇关于管理软件中信息加密和安全的文章,感觉非常有实际意义.文中作者从实践经验出发,讨论了信息管理软件中如何通过哈希和加密进行数据保护.但是从文章评论中也可以看出很多朋友对这个方面一些基本概念比较模糊,这样就容易“照葫芦画瓢”,不能根据自身具体情况灵活选择和使用各种哈希和加密方式.本文不对哈希和加密做过于深入的讨论,而是对哈希和加密的基本概念和原理进行阐述.比较,并结合具体实践说明如何选择哈希和加密算法.如何提高安全性等问题,使朋友们做到“知其然,知其所以然”,这样就