太平洋汽车网 | 太平洋游戏网 | 太平洋女性网 | 太平洋亲子网 | PC购物网  网站地图  
太平洋电脑网
首    页
产业资讯
行情报价产品库
数据调研评测室
服 务 器网络设备
方案应用办公设备
软件资讯产品论坛PCclub社区
下载中心软件论坛摄影部落
渠道商情通信游戏科技奥运
图库二手招聘培训
diyDIY硬件 手机手  机 笔记本笔记本 台式机台式机

数码世界

数码相机数码相机 随身听MP3/MP4 摄像机摄像机 数字家电数字家电 精品廊精品廊
北京 上海 广州 深圳 香港 广西 重庆 武汉 山东 江苏 辽宁 福建 成都 西安 江西 湖南 黑龙江 台湾
 
 
   
软件 首页 | 资讯 | 应用 | 评测 | 教你学电脑 | 信息安全 | 创意设计 | 开发特区 | 软件下载 | 专题 | 社区
 
软件 特色专区: QQ大本营 | Vista专区 | msn总动员 | 组网专栏 | Photoshop | 视频专栏 | 常用软件
 
您现在的位置: 软件  >  开发特区  >  Web开发  >  CGI

Perl教学 第九篇 关联数组(哈希表)

出处:PConline[ 2004-02-14 09:33:55 ] 作者:flamephoenix 责任编辑:pjl

导 读  
  Perl教学 第九篇 关联数组(哈希表)
一、数组变量的限制 在前面讲的数组变量中,可以通过下标访问其中的元素。例如,下列语句访问数组@array的第三个元素: $scalar = $array[2]; 虽然数组很有用,但它们有一个显著缺陷,即很难记住哪个元素存贮的什么内容。假如我们来写一个程序计算某文件中首字母大写的单词出现的次数,用数组来实现就比较困难,程序代码如下: 1 : #!/usr/local/bin/perl 2 : 3 : while ($inputline = ) { 4 : while ($inputline =~ /\b[A-Z]\S+/g) { 5 : $word = $&; 6 : $word =~ s/[;.,:-]$//; # remove punctuation 7 : for ($count = 1; $count <= @wordlist; 8 : $count++) { 9 : $found = 0; 10: if ($wordlist[$count-1] eq $word) { 11: $found = 1; 12: $wordcount[$count-1] += 1; 13: last; 14: } 15: } 16: if ($found == 0) { 17: $oldlength = @wordlist; 18: $wordlist[$oldlength] = $word; 19: $wordcount[$oldlength] = 1; 20: } 21: } 22: } 23: print ("Capitalized words and number of occurrences:\n"); 24: for ($count = 1; $count <= @wordlist; $count++) { 25: print ("$wordlist[$count-1]: $wordcount[$count-1]\n"); 26: } 运行结果如下: Here is a line of Input. This Input contains some Capitalized words. ^D Capitalized words and number of occurrences: Here: 1 Input: 2 This: 1 Capitalized: 1 这个程序每次从标准输入文件读一行文字,第四行起的循环匹配每行中首字母大写的单词,每找到一个循环一次,赋给简单变量$word。在第六行中去掉标点后,查看该单词是否曾出现过,7~15行中在@wordlist中挨个元素做此检查,如果某个元素与$word相等,@wordcount中相应的元素就增加一个数。如果没有出现过,即@wordlist中没有元素与$word相等,16~20行给@wordlist和@wordcount增加一个新元素。 二、定义 正如你所看到的,使用数组元素产生了一些问题。首先,@wordlist中哪个元素对应着哪个单词并不明显;更糟的是,每读进一个新单词,程序必须检查整个列表才能知道该单词是否曾经出现过,当列表变得较大时,这是很耗费时间的。 这些问题产生的原因是数组元素通过数字下标访问,为了解决这类问题,Perl定义了另一种数组,可以用任意简单变量值来访问其元素,这种数组叫做关联数组,也叫哈希表。 为了区分关联数组变量与普通的数组变量,Perl使用%作为其首字符,而数组变量以@打头。与其它变量名一样,%后的第一个字符必须为字母,后续字符可以为字母、数字或下划线。 三、访问关联数组的元素 关联数组的下标可以为任何简单/标量值,访问单个元素时以$符号打头,下标用大括号围起来。例如: $fruit{"bananas"} $number{3.14159} $integer{-7} 简单变量也可作为下标,如: $fruit{$my_fruit} 四、增加元素 创建一个关联数组元素最简单的方法是赋值,如语句$fruit{"bananas"} = 1; 把1赋给关联数组%fruit下标为bananas的元素,如果该元素不存在,则被创建,如果数组%fruit从未使用过,也被创建。 这一特性使得关联数组很容易用于计数。下面我们用关联数组改写上面的程序,注意实现同样的功能此程序简化了许多。 1 : #!/usr/local/bin/perl 2 : 3 : while ($inputline = ) { 4 : while ($inputline =~ /\b[A-Z]\S+/g) { 5 : $word = $&; 6 : $word =~ s/[;.,:-]$//; # remove punctuation 7 : $wordlist{$word} += 1; 8 : } 9 : } 10: print ("Capitalized words and number of occurrences:\n"); 11: foreach $capword (keys(%wordlist)) { 12: print ("$capword: $wordlist{$capword}\n"); 13: } 运行结果如下: Here is a line of Input. This Input contains some Capitalized words. ^D Capitalized words and number of occurrences: This: 1 Input: 2 Here: 1 Capitalized: 1 你可以看到,这次程序简单多了,读取输入并存贮各单词数目从20行减少到了7行。 本程序用关联数组%wordlist跟踪首字母大写的单词,下标就用单词本身,元素值为该单词出现的次数。第11行使用了内嵌函数keys()。这个函数返回关联数组的下标列表,foreach语句就用此列表循环。 注:关联数组总是随机存贮的,因此当你用keys()访问其所有元素时,不保证元素以任何顺序出现,特别值得一提的是,它们不会以被创建的顺序出现。 要想控制关联数组元素出现的次序,可以用sort()函数对keys()返回值进行排列,如: foreach $capword (sort keys(%wordlist)) { print ("$capword: $wordlist{$capword}\n"); }
前一页 [1] [2] [3] [4] 下一页
下一篇:Perl教学 第十一篇 文件系统
 今日论坛热贴推荐
·几秒钟合并N个TXT文件
·技巧:怎么清除Windows 7视频锯齿现象
·揭密网游帐号是怎样被盗的全过程
·没有刻录机?Windows 7硬盘安装四大法
·Windows 7将解决微软的“纠结”
·全球首款装正版win7的thinkpad x200
·十大理由决定Windows 7成败
·微软官网首次提及Windows 7 SP1
·从Windows桌面看性格【娱乐】
·惊现google官方Chrome Os下载!?
更多资讯请点击: Perl教学  关联数组(哈希表) 

  发给好友 我要报错 投稿给我们 加入收藏 返回顶部  
相关文章  

About Us | 关于我们 | 隐私政策 | 广告服务 | 联系我们 | 招聘精英 | 网站律师 | 合作联系 | 友情链接
太平洋专业网站群:  太平洋电脑网 ┊ 太平洋汽车网 ┊ 太平洋游戏网 ┊ 太平洋女性网 ┊ 太平洋亲子网

广东省通信管理局
ICP证粤B2-20040647
互联网清理整顿
技术支持与报障:support@pconline.com.cn
        020-87568837         
对本站有任何建议、意见或投诉,请点这里在线提交.
本网站简体、繁体两种版本,以简体版为准
PConline版权所有,未经授权禁止转载、摘编、复制或建立镜像.如有违反,追究法律责任