2.4 perl--哈希

哈希是一种数据结构,它和数组的相似之处 在于可以容纳任意多的值并能按需取用,而它和数组的不同在于索引方式,数组以数字来索引,哈希则是以名字来索引。哈希的索引值为键(key),并不是数字,而是任意唯一的字符串。这些键和值都是任意的标量,但键总会被转换为字符串。即使哈希包含300万个键值对,从中提取任意的一项数据还是会和原来一样快。但键则必须是唯一的字符串。

它有什么用呢?

按名字找姓
按主机名找IP
按IP找主机名
按单词统计其出现次数(用的比较多)
按用户名统计每个人使用

说白了,哈希就是个极其简单的数据库。

访问哈希元素:

$family_name{'fred'}='flintstone';		

这和数组的做法类似,只是使用了花括号而非方括号来表示索引值

哈希变量的命名不可以用数字开头。

访问整个哈希 :

%some_hast=('foo',35,'bar',12.4,2.4,'helllo','wilma',1.72,'betty',"bye\n");

对哈希的赋值,等同于在列表上下文中赋值,列表中的元素应该为键值对。 也可以通过 my$inverse_hash=reverse %any_hash

把键值对给范徐过来,最好确认值也是唯一的在使用,不然会弄错。

my %last_name=(
   'fred' => 'flintstone',
   'dino' => undef,
    barney=>'rubble',
    betty =>'rubble',
       );

任何需要逗号的地方都可以用胖箭头来替代,这对perl来说,并没有多大的区别。使用胖箭头的时候可以省略左边的引号,会自动被引起。同时,在使用哈希额键,如果花括号内只有裸字,两边的引号也可以省略。(无需引号的字符序列,我们称之为裸字bareword,因为它是孤立存在的) 当然注意,$hash{bar.foo}=1; #构成的键名是’barfoo'

my @k =keys $hash;
my @v=values $hash;

因为哈希就像一个大酒桶,所以里面的顺序是无法预测的,但是返回的键列表和值列表的顺序还是一致的。

my $count =keys %hash;  #得到键值对数

while(($key,$value)=each %hash){
print "$key =>$value\n";
  }

delete $books{$person}; #撤销person的

%ENV 环境变量 修改环境变量 Bourne shell

$CHARACTER=Fred; export CHARACTER
$export CHARACTER=Fred

csh

$ setenv CHARACTER FRED

DOS或者Windows命令

c:>set CHARACTER=Fred

例1:根据姓来找名字(很有意思的),程序名family_name

#! /usr/bin/perl
use warnings;
use strict;
my $s;
my �mily_name=("fred"=>'flintstone',
             "barney"=>'rubble',
              "wilma"=>'flintstone',
               );
print "please enter the family name:\n";
$s=<>;
chomp $s;
print "The ${s}'s name is $family_name{$s}.\n"

例2:程序名为frequence,统计每行一个词汇,这个词汇出现的次数。

#! /usr/bin/perl
use strict;
use warnings;
my ($string,@string,%string);
@string=<>;
chomp @string;
foreach $string (@string){
   $string{$string}+=1; 
    }
foreach $string (sort keys %string){
   print"$string has show up $string{$string} times.\n";
  }

例3:程序名为ENV,读取%ENV中的键值对,排序,分两列打印,纵向对其。

#! /usr/bin/perl
use warnings;
use strict;
my $longest;
my $key;
my $length;
foreach $key (sort keys %ENV){
my $length=length($key);
if ($length>=$longest){
  $longest=$length;
  }
 }
foreach $key (sort keys %ENV){
printf "%-${longest}s %s\n","$key","$ENV{$key}";
  }

注:my操作符只能申明独立的标量,不能用来申明数组或哈希里的元素。 use strict起作用时候才需要申明变量,默认情况下并不需要申明标量。

ps:

  1. 上面的方法尽管参考,方法肯定不止一个
  2. 如果跟我一样是菜鸟,请结合我的第之前的博客看如何运行这样的脚本。
  3. 博文内容为整理的《Perl语言入门》这本书,感谢这个书的作者Randal L等人的付出
药企,独角兽,苏州。团队长期招人,感兴趣的都可以发邮件聊聊:tiehan@sina.cn
个人公众号,比较懒,很少更新,可以在上面提问题,如果回复不及时,可发邮件给我: tiehan@sina.cn