perl学习笔记——哈希

哈希

哈希是一种数据结构,它和数组的相似之处在于可以容难任意多的值并能按需取用,而他和数组的不同在于索引的方式,数组是以数字为索引而哈希则是以名字为索引。

哈希的键是唯一的,哈希的值可以重复。

哈希的应用场景

举例:

  • 按名字找姓;
  • 按主机名找IP地址或者按照IP地址找主机名;
  • 按照单词统计其出现次数;
  • 按用户名统计每个人使用的磁盘块数量;
  • 按照驾照号码找出姓名。

访问哈希元素

如:$hash{$some_key} //注意使用的是大括号{} 不是中括号

赋值: $family_name{‘fred‘}=‘flintstone‘;

    $family_name{‘barney‘}=‘rubble‘;

访问整个哈希

%some_hash=(‘foo‘,35,‘bar‘,12.4); // %<哈希名>=(key,value,key,value......)

可以用下面代码简单查看:

my @k=keys %some_hash;//keys后面讲解

foreach (@k)

{

  print "$_=>$some_hash{$_}"."\n";

}

注意输出顺序可能是乱序。

@tmp_hash=%some_hash==>结果:tmp=foo 35 bar 12.4

哈希赋值

my %new_hash=%old_hash;==>会为new_hash分配内存,然后将old_hash的值赋过去。并不是简简单单引用

my %inverse_hash=reverse %any_hash;

上面这个比较适用于:按主机名找IP地址或者按照IP地址找主机名

胖箭头=>

主要目的是为了对下面这种模式的改善:%some_hash=(‘foo‘,35,‘bar‘,12.4);

如:my %some_hash=(

  ‘foo‘=>35,

  ‘bar‘=>12.4,

  ‘dnio‘=>undef,

);

注意:每一行的最后都有逗号.

哈希函数

keys values

keys函数能返回哈希的键列表,values函数能返回对应的值的列表。

如:my %hash=(‘a‘=>1,‘b‘=>2,‘c‘=>3,);

  my @k=keys %hash;// 将会得到 a b c

  my @v=values %hash;// 将会得到 1 2 3

如果使用: my $count=keys %hash;//将会得到3 也就是说hash有3对键

each函数

如果需要迭代整个哈希,常见的用法就是用each函数.每次返回的就是hash表的键、值对。直到所有的元素都被访问完。

如:while (($k,$v)=each %hash){

  print "$k=>$v\n";

}

再比如:each返回键-值对的顺序是乱序的,但它与keys和values返回的顺序相同,也就是hash的自然顺序。如果需要依次处理hash,则只需要对键排序就行

foreach $key(sort keys %hash){

  $value=$hash{$key};

  say "$key=>$value";

}

exists函数

检查哈希表中是否存在某个键。

if (exists $hash{‘foo‘}){

  say "there is a foo";

}

delete函数

从哈希中删除指定的键和相对应的值。(总是成功)

my $person="betty";

delete $hash{$person};

%ENV哈希

Perl程序既然运行在某个环境中,就需要对周围的环境有所感知。Perl访问这些环境信息的方法就是访问%ENV哈希。如:

print "PATH is $ENV{PATH}";

时间: 2024-10-08 21:00:14

perl学习笔记——哈希的相关文章

Perl学习笔记(一)--简介

1. 查看当前所用Perl版本号 ? 1 perl –v 2.  一个简单的Perl程序 ? 1 2 3 print "hello world"; #这是注释 执行它: ? 1 Perl helloWorld.txt 文件名后缀可以是pl可以是txt 3. 一个稍微复杂点的Perl程序 ? 1 2 3 4 5 6 @line = `perldoc -u -f atan2`; //运行一个外部命令,通过反引号来调用,将输出结果一行行依次存储在@line这个数组变量中 foreach(@l

perl学习笔记--搭建开发环境

windows下perl开发环境搭建 perl下载地址:http://www.activestate.com/developer-tools 各个插件的安装方法:(通过代理上网的方法) 方法一:padwalker的安装步骤 1. padwalker下载地址: http://www.bribes.org/perl/ppm/ 2. 解压下载的文件 4. 拷贝 blib/lib/PadWalker.pm 到 Perl/lib(你的安装路径)5. 拷贝 blib/arch/auto/PadWalker

PERL学习笔记---正则表达式的应用

使用m//匹配 //这是m//(模式匹配)的一种简写.同qw//操作一样,可以使用任何成对的分隔符.因此,可以使用m(fred), m<fred>, m{fred}, m[fred],或者m,fred,, m!fred!, m^fred^,其它非成对的分隔符也可以 不区分大小写:/i if(/yes/i) {#大小写无关 print “In that case, I recommend that you go bowling.\n”;} 匹配任何字符:/s 默认情况下,点(.)不匹配换行符,这

Perl 学习笔记-哈希

1.Perl中的哈希 高效快捷, 没有大小限制. 大哈希一样很快! 命名: 和Perl其他标识符一样, 同时拥有自己的的名字空间.  $roger{"sex"} 和 $roger没有关系 赋值: 对已存在的哈希赋值会覆盖原有值. 哈希元素会因赋值而产生(赋值就是"插入"哈希表中),  访问不存在值就会得到undef $roger{'name'}="roger"; if($roger{'sex'} == undef){ print "un

Perl 学习笔记-标量数据

最近学习Perl, 准备看一遍入门指南,关键的东西还是记录下来,以便以后复习和查看参考. 笔记来自<<Perl语言入门第5版>> 1. 在Perl内部,不区分整数值和浮点数值,所有数字的内部格式都相同,采用"双精度浮点数"运算,自动转换.范围值(1e-100到 1e100) 2. 可以在一个很大的数中间插入下划线,便于阅读: 61_298_040_283_768,在取模运算时,如果其中一边或两边都是负数,则不同的Perl版本可能会有不同结果.不能计算负数的负数次方,因为会得到复数,

Perl 学习笔记

Note I:子程序的基本应用1 1 #!/usr/bin/perl -w 2 3 use 5.018; 4 5 sub total 6 { 7 my $res; 8 foreach (@_) 9 { 10 $res += $_; 11 } 12 $res; 13 } 14 15 my @list; 16 my $cur; 17 while ($cur = <STDIN>) 18 { 19 chomp $cur; 20 push @list, $cur; 21 } 22 my $sum; 23

Perl 学习笔记-高级控制结构

1.unless控制结构 类似于独立的else语句; 要么条件为真, 要么执行语句块内的代码;  unless(<condition>){code...;} 等价于  if(<condition>){}else{code...;}  也就是当条件为假是执行. unless (0) { print "Hello"; #Hello } 2. until控制结构 until就是改装过的while, 区别在于它在条件为假是执行代码块. $i = 2;$j = 10; u

Perl学习笔记(1)----入门

在UNIX/Linux 系统上,打开命令终端,输入 'rpm -q perl' 查看系统是否安装了 perl ---- 在自己的CentOS7 系统上,默认自带了 perl 软件: [email protected]:~/Documents/bash$ rpm -q perl perl-5.16.3-286.el7.x86_64 可以看到系统默认已经安装了 perl5 软件. 查看安装位置: [email protected]:~/Documents/bash$ which perl /bin/

Perl 学习笔记-目标操作

1.在目录树中移动. 程序运行时会以当前工作目录作为相对路径的起点, 可以使用  chdir 操作符改变当前目录: chdir "/etc" or die "Can't chdir to /etc:$!"; #因为这是一个相对操作系统的调用, 所以错误信息会返回到 $! 中. 由Perl程序启动的所有进程都会继承Perl程序的工作目录. 但对于启动Perl的进程,它的工作目录不会随Perl工作目录的改变而改变, 所以无法写出任何Perl程序来代替Shell里的cd命