文档章节

Perl-哈希数组

郑明洋兮
 郑明洋兮
发布于 2016/11/22 15:16
字数 1303
阅读 343
收藏 0
点赞 0
评论 0

1、哈希的基本用法
用数组初始化%hash为a=>1,b=>2  %hash=('a',1,'b',2);
意义同上,只是另一种更形象化的写法。%hash=('a'=>1,'b'=>2);
如果key是字符串,可以省略引号。下面这行和上面那行是一样的%h=(a=>1,b=>2);
哈希的赋值 
    将列表赋值到哈希是常常发现列表中的键值对不容易区分。
Perl使用胖箭头(=>)来代替逗号。
my %animal = (
    'dog' => 'caoqing',
    'cat' => 'xiaohhuan',
    'pig' => 'xiaobao',
);
使用旁箭头是可以省略键的引号,左边的部分可以被自动引用。
无需引号的字符序列,称为裸字。
允许省略键名义好的地方是花括号中检索指定键名的元素。比如$animal{'dog'}可以简写为$animal{dog}。不加引号已经成为惯例,如果花括号内不是裸字,Perl会将其做为表达式求值,结果作为键名。

哈希函数
keys和values函数
keys函数返回哈希的键列表,values函数返回哈希的值列表。
my %hash = ('a' => 1, 'b' => 2, 'c' => 3,);
my [@k](https://my.oschina.net/doloop) = keys %hash;
my [@v](https://my.oschina.net/opleo) = values %hash;
print "@k\n";
print "@v";

a b c
1 2 3
Perl会根据需要重新优化排列顺序,以保持高速访问。在标量上下文中,这两个元素会返回哈希中的元素个数。这个过程不需要遍历整个哈希,所以非常高效。
my %hash = ('a' => 1, 'b' => 2, 'c' => 3,);
my [@k](https://my.oschina.net/doloop) = keys %hash;
my @v = values %hash;
my $count = @k;
print "$count\t";
my $count2 = @v;
print "$count2";

3    3
哈希也可以当作布尔值来判断真假,至少有一个键值对,就返回真。


用{}来访问print “$hash{a}\n”;
打印 $hash{b}='2b'; print “$hash{b}\n”; #打印2b
删除key用delete   delete$hash{b};  
从$hash删除'b'
清空hash :undef %h


each函数
需要迭代整个哈希时,常见就是each函数,包含两个元素的列表形式返回键值对每次对同一个哈希调用此函数,就会返回下一组键值对,直到所有的元素都被访问过。在没有任何键值对时,each函数会返回空列表。
唯一适合使用each的地方就是在while循环里。
my %hash = ('a' => 1, 'b' => 2, 'c' => 3,);
while (($key, $value) = each %hash) {
    print "$key => $value\n";
}

c => 3
a => 1
b => 2
each返回键值对是乱序的,keys和values返回哈希的自然顺序,如果一次处理哈希,只需要对键排序。
my %hash = ('a' => 1, 'b' => 2, 'c' => 3,);
foreach $key (sort keys %hash) {
  $value = $hash{$key};
  print "$key => $value\n";
}

a => 1
b => 2
c => 3

哈希的典型应用
exists函数
若要检查哈希中是否存在某个键,可以使用exists函数,返回真假,分别表示键存在与否。
my %hash = ('a' => 1, 'b' => 2, 'c' => 3,);
if (exists $hash{d}) {
  print "i love you";
} else {
  print "i hate you";
}

i hate you
delete函数
delete函数可以从哈希删除指定的键及其对应的值。假如键不存在,会直接结束,不出现警告信息或错误信息。
my %hash = ('a' => 1, 'b' => 2, 'c' => 3,);
delete $hash{a};
print keys %hash;

1. 编程读取用户指定的名字并且汇报相应的姓。
my %last_name = qw {
  cao qing
  xiao bao
  wang huan
};
print "Enter a first name: ";
chomp(my $name = <STDIN>);
print "That is $name $last_name{$name}.\n";
2.编程读取单词,然后打印列出每个单词出现次数的列表。
my (@words, %count, $word);
@words = qw(i love you cao qing. you are the best people on the world!);
foreach $word (@words) {
  $count{$word} += 1;
}
foreach $word (keys %count) {
  print "$word was seen $count{$word} times.\n";
}


2、哈希数组
哈希内嵌套数组

1.哈希内嵌数组语法格式如下:声明及定义
my%哈希变量=( 
    哈希键1=>[数组元素1,数组元素2,…,数组元素n],
    哈希键2=>[数组元素1,数组元素2,…,数组元素n],
    …...…... 
    哈希键n=>[数组元素1,数组元素2,…,数组元素n]
); 
    访问内嵌数组的单个元素: $哈希变量名{哈希键}->[数组下标]
    访问内嵌数组: @{$哈希变量名{哈希键}} 
    例如,游戏地图上有一组建筑物的坐标,分别如下
:武器店:123,35修练场
:85,196防具店
:67,96魔法店
:128,45 
用哈希内嵌数组的方式来存储和访问这些数据。

1)存储
    my%game=( 
    “武器店”=>[123,35],
    “修练场”=>[85,196],
    “防具店”=>[67,96],
    “魔法店”=>[128,45] 
); 
2)访问
     访问防具店的坐标值: printf("%d,%d",@{$game{"防具店"}});
    访问魔法店的坐标Y值:print$game{“防具店”}->[1]; 
    可使用硬引用符来完成内嵌数组的赋值。
    my%game; 
    my@array=(123,35);
    $game{"武器店"}=\@array;
    my@array=(85,196);
    $game{"修练场"}=\@array;
    my@array=(67,96);
    $game{"防具店"}=\@array;
    my@array=(67,96);
    $game{"魔法店"}=\@array; 
    printf("%d,%d",@{$game{"防具店"}});
 

© 著作权归作者所有

共有 人打赏支持
郑明洋兮
粉丝 2
博文 1
码字总数 1303
作品 0
郑州
perl学习【转载+积累】

基本信息 Perl一般被称为“实用报表提取语言”(Practical Extraction and Report Language)。Perl 最初的设计者为拉里·沃尔(Larry Wall),他于1987年12月18日发表。Perl借取了C、sed、a...

carmen-ly ⋅ 2016/08/11 ⋅ 0

Perl常用模块 (Data::Dumper)

为什么使用引用? 在perl4中,hash表中的value字段只能是scalar,而不能是list,这对于有些情况是很不方便的,比如有下面的数据: Chicago, USA Frankfurt, Germany Berlin, Germany Washin...

SibylY ⋅ 2014/06/13 ⋅ 0

perl的变量与括号

perl的变量与括号 tkorays(tkorays@hotmail.com) 更喜欢在坑上乱跳 perl中的括号很有意思,各种括号开始的时候真有些让人有点迷糊。但是渐渐地会发现,这里面都是有规律的。 基础变量类型 ...

tkorays ⋅ 2014/08/16 ⋅ 0

PHP Perl 关联数组 哈希表 Hash Table

关联数组,又称为哈希表(hash table),是一种非常好用的数据结构。 在程序中,我们可能会遇到需要消重的问题,举一个最简单的模型: 有一份用户名列表,存储了 10000 个用户名,没有重复项...

月洛 ⋅ 2013/08/30 ⋅ 1

perl引用和数组

一、引用 常见数据类型的引用定义: 数据类型 定义 举例 标量变量 $Var $Pointer = $Var 数组 @Array $Pointer = @Array 哈希变量 %Hash $Pointer = %Hash 文件句柄 *FILEHANDLE $Pointer =...

SibylY ⋅ 2014/05/11 ⋅ 0

perl面试例题一

Perl 第一阶段学习总结 1 use strict 和 use warnings 的作用? use strict 什么场合要用 use strict? 当你的程序有一定的行数时,尤其是在一页放不下时,或者是你找不到发生错误的原因时。...

tfirer ⋅ 2012/03/09 ⋅ 0

如何使用perl从数据构造json对象,并且指定属性的顺序?

在用perl将网页中的表格抓取下来存成json格式的文本。 用JSON模块可以分别从列表和哈希生成JSON对象和数组,但是如果只需求JSON对象的话,用encode_json %src生成的json对象的属性完全无序。...

YenvY ⋅ 2015/03/11 ⋅ 0

Perl 5.6 的新特性在哪些方面优于 C/C++/Java?

Cultured Perl: 吸引 C 和 Java 程序员目光的Perl 5.6 Perl 5.6 的新特性在哪些方面优于 C/C++/Java? 转自:http://www-128.ibm.com/developerworks/cn/linux/sdk/perl/culture-2/index.htm......

范堡 ⋅ 2009/01/06 ⋅ 0

如何编写简单的Perl模块

为什么要写或要模块呢?简言之:代码重用,更多见于写一组工具集,有很多地方是可以避免重写的。如何能把这些独立抽象出来,在需要的时候载入进程序执行,提高编写的效率和减少维护。基于此,...

苏巴什 ⋅ 2014/04/22 ⋅ 3

Perl简单模块指南

关于using warnings和use模块的使用。 下面是这个模块的内容: MyModule.pm package MyModule; use strict;use Exporter;use vars qw($VERSION @ISA @EXPORT @EXPORTOK %EXPORTTAGS); $VERSI......

晓亮1210 ⋅ 2013/05/08 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Nginx服务架构初探(四):nginx服务器的rewrite功能

nginx服务器的rewrite功能 1.nginx后端服务器组的配置 1>upstream name {…} name是给服务器组限的组名 2>server address [parameters]; address为服务器地址 parame......

余温灬未存 ⋅ 今天 ⋅ 0

layer.prompt使文本框为空的情况下也能点击确定

最近一直在使用layui,但是用到弹出层layer.prompt时,如果文本框是空的话点击确定没有反应,不能向下执行。 但是我又需要空值,看看我原来的代码。 123456789 layer.prompt...

孟飞阳 ⋅ 今天 ⋅ 0

Linux普通文件压缩工具gzip、Bzip2、xz

第六章 文件压缩和打包 6.1 压缩打包介绍 Linux环境常见压缩文件类型: .zip,.gz,.bz2,.xz, .tar.gz,.tar.bz2,.tar.xz 压缩打包的目的 方便文件传输 节省磁盘空间 减少传输花费的时间 ...

弓正 ⋅ 今天 ⋅ 0

移动弹窗基础知识浅析——IOS弹窗体系

摘要: 最为常见的【弹窗】反而是最“捉摸不定”的东西。各种类型的弹窗傻傻分不清楚,不知道在什么场景下应该用哪种弹窗。尤其是遇到“二次确认”等场景…… 因此,打算从头整理移动弹窗的基...

阿里云云栖社区 ⋅ 今天 ⋅ 0

zabbix短信报警统计以及报表展示

一、需求 由于我们的业务报警比较频繁,之前是针对每个报警进行具体处理,但是有时还会重复出现,或者后续处理有时忘记跟进等,因此进行报警短信的统计,可以针对一些问题与业务跟进,明确后...

o翡翠谷o ⋅ 今天 ⋅ 0

JNI 输出LOG

1、导入log头文件。在你使用的 .c/ .cpp 文件中,导入 log.h 头文件。 #include<android/log.h> 2、在android.mk 加上 LOCAL_LDLIBS := -llog 或 LOCAL_SHARED_LIBRARIES := liblog 3、定义L......

国仔饼 ⋅ 今天 ⋅ 0

主线程pthread_exit 作用

#include <iostream>#include <pthread.h>#include <unistd.h>using namespace std;#define NUM_THREADS 10void* say_hello(void* args){ int i = *((int*)args);/......

xxdd ⋅ 今天 ⋅ 0

崛起于Springboot2.X之Mybatis-xml方式操作mysql数据库(3)

序言:当第一篇讲道Mybatis的时候,只要使用过mybatis的java程序员100%都会知道这种方式,因为这是最广泛最全面的编写sql操作mysql数据库的方式,高级sql的编写往往通过xml方式,接下来进入正...

木九天 ⋅ 今天 ⋅ 2

移动弹窗基础知识浅析——IOS弹窗体系

摘要: 最为常见的【弹窗】反而是最“捉摸不定”的东西。各种类型的弹窗傻傻分不清楚,不知道在什么场景下应该用哪种弹窗。尤其是遇到“二次确认”等场景…… 因此,打算从头整理移动弹窗的基...

猫耳m ⋅ 今天 ⋅ 0

spring elasticsearch 2.4 date 日期

1.mappingPUT user_behavior { "mappings": { "user_behavior": { "properties": { "date": { "type": "createDate", ......

xiaomin0322 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部