大雀软件园

首页 软件下载 安卓市场 苹果市场 电脑游戏 安卓游戏 文章资讯 驱动下载
技术开发 网页设计 图形图象 数据库 网络媒体 网络安全 站长CLUB 操作系统 媒体动画 安卓相关
当前位置: 首页 -> 技术开发 -> CGI专区 -> Perl教学 第九篇 关联数组之三

Perl教学 第九篇 关联数组之三

时间: 2021-07-31 作者:daque

上例中,大略变量$header含有链表中第一个单词,它同声也是关系数组第一个元素的下标,其值baker又是下一个元素的下标,依该类推。下标为delta的结果一个元素的值为空串,表白链表的中断。在将要处置的数据个数未知或其随步调运转而延长的情景下,链表格外有效。下例用链表按假名步骤输入一个文献中的单词。1 : #!/usr/local/bin/perl2 :3 : # initialize list to empty4 : $header = "";5 : while ($line = ) {6 : # remove leading and trailing spaces7 : $line =~ s/^\s+|\s+$//g;8 : @words = split(/\s+/, $line);9 : foreach $word (@words) {10: # remove closing punctuation, if any11: $word =~ s/[.,;:-]$//;12: # convert all words to lower case13: $word =~ tr/a-z/a-z/;14: &add_word_to_list($word);15: }16: }17: &print_list;18:19: sub add_word_to_list {20: local($word) = @_;21: local($pointer);22:23: # if list is empty, add first item24: if ($header eq "") {25: $header = $word;26: $wordlist{$word} = "";27: return;28: }29: # if word identical to first element in list,30: # do nothing31: return if ($header eq $word);32: # see whether word should be the new33: # first word in the list34: if ($header gt $word) {35: $wordlist{$word} = $header;36: $header = $word;37: return;38: }39: # find place where word belongs40: $pointer = $header;41: while ($wordlist{$pointer} ne "" &&42: $wordlist{$pointer} lt $word) {43: $pointer = $wordlist{$pointer};44: }45: # if word already seen, do nothing46: return if ($word eq $wordlist{$pointer});47: $wordlist{$word} = $wordlist{$pointer};48: $wordlist{$pointer} = $word;49: }50:51: sub print_list {52: local ($pointer);53: print ("words in this file:\n");54: $pointer = $header;55: while ($pointer ne "") {56: print ("$pointer\n");57: $pointer = $wordlist{$pointer};58: }59: } 运转截止如次:here are some words.here are more words.here are still more words.^dwords in this file:areheremoresomestillwords 此步调分为三个局部:·主步调:读取输出并变换到相映的方法。 ·子步调:add_word_to_list,创造排序单词链表。 ·子步调:print_list,输入单词链表 第3~17动作主步调,第4行初始化链表,将表头变量$header设为空串,第5行起的轮回历次读取一条龙输出,第7行去掉头、尾的空格,第8即将句子分隔成单词。9~15行的内轮回历次处置一个单词,即使该单词的结果一个字符是圈点标记,就去掉。第13行把单词变换玉成小写情势,第14行传播给子步调add_word_to_list。子步调add_word_to_list先在第24行处查看链表能否为空。即使是,第25即将单词赋给$header,26行创造链表第一个元素,存贮在关系数组%wordlist中。即使链表非空,37行查看第一个元素能否与该单词沟通,即使沟通,就连忙归来。下一步查看这一新单词能否该当为链表第一个元素,即其按假名程序先于$header。即使是如许,则:1、创造一个新元素,下标为该新单词,其值为原第一个单词。2、该新单词赋给$header。即使该新单词不该为第一个元素,则40~44行运用局域变量$pointer探求其符合的灵验场所,41~44行轮回到$wordlist{$pointer}大于或即是$word为止。接下来46行察看该单词能否已在链表中,即使在就归来,要不47~48即将其增添到链表中。开始47行创造新元素$wordlist{$word},其值为$wordlist{$pointer},这时候$wordlist{$word}和$wordlist{$pointer}指向同一个单词。而后,48即将$wordlist{$pointer}的值赋为$word,行将$wordlist{$pointer}指向刚创造的新元素$wordlist{$word}。结果当处置结束后,子步调print_list()顺序输入链表,局域变量$pointer含有正在输入的值,$wordlist{$pointer}为下一个要输入的值。注:普遍不须要用链表来做那些处事,用sort()和keys()在关系数组中轮回就充满了,如:foreach $word (sort keys(%wordlist)) {# print the sorted list, or whatever } 然而,这边波及的南针的观念在其它数据构造中很有意旨。

热门阅览

最新排行

Copyright © 2019-2021 大雀软件园(www.daque.cn) All Rights Reserved.