如何用Perl关联数组创建数据结构

如题所述

用Perl关联数组创建数据结构
1、(单)链表
链表是一种比较简单的数据结构,可以按一定的次序存贮值。每个元素含有两个域,一个是值,一个是引用(或称指针),指向链表中下一个元素。一个特殊的头指针指向链表的第一个元素。
在Perl中,链表很容易用Perl关联数组实现,因为一个元素的值可以作为下一个元素的索引。下例为按字母顺序排列的单词链表:%words=(abel,baker,
baker,charlie,
charlie,delta,
delta,);$header=abel;
下标为delta的最后一个元素的值为空串,表示链表的结束。在将要处理的数据个数未知或其随程序运行而增长的情况下,链表十分有用。
此程序分为三个部分:
◆主程序:读取输入并转换到相应的格式。
◆子程序: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行创建链表第一个元素,存贮在Perl关联数组%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()在Perl关联数组中循环就足够了,如:
foreach$word(sortkeys(%wordlist)){
但是,这里涉及的指针的概念在其它数据结构中很有意义。
温馨提示:内容为网友见解,仅供参考
无其他回答

Perl 内部结构详解: PerlGuts Illustrated
指针类型的SV使用RV结构,指向其他任意数据结构,示例展示了如何使用指针进行数据操作。数组AV结构包含数组元素及其索引,通过示例代码展示数组的创建和使用。数组的shift和pop操作可通过ARRAY FILL MAX参数进行。散列HV结构复杂,使用HE和HEK表示键值对,包含key\/value结构。通过示例代码展示如何操作散列表。RITER...

Perl中这样的数据结构,高手解读下
use Data::Dumper;然后在最外面的循环结束之后 print Dumper (\\%data_ptr);print Dumper (\\%formats);执行就能看见结构了 参考资料:perldoc Data::Dumper

在perl中 用 push @{$rules->{dup_name("$name")}}, ""; 这个语句...
rules->{dup_name("$name")}:在散列rules中找到上面返回的字符串为key对应的value,该value做为一个数组的名字。push @{$rules->{dup_name("$name")}}, ""; :在该数组中push一个空值(""中为空值,如果里面有其他值的话,就将""中的值push到该数组中了)。这句的整体的数据结构就是...

perl脚本 %F什么意思
相当于Perl 内置的数据结构 表示普通变量 表示散列 表示数组 \\相当于引用 $n=\\@m 这样$n->[0] == $m[0]了 类似的$n =\\%m $n->{key} == $m{key}

如何用Perl语言实现RGB888转RGB565
RGB888数据结构由红、绿、蓝三个分量组成,每个分量占用24位,总共有8个字节。而RGB565模式中,红色和绿色各占用5位,蓝色占用6位,总共占用16位,即2个字节。转换的关键是截取并组合适当的位数。以下是一个基本的Perl代码示例,展示了如何执行RGB888到RGB565的转换:perl sub rgb888_to_rgb565 { my ...

perl hash问题
所以你调用keys函数的时候,返回的是(1,2,3)这个列表,打印出来的时候自然就是1,2,3了。这里面有一些perl的数据结构的知识,总之,在perl里面,引用是个非常强大的东西,[],{}是用来生成匿名数组和哈希的,并返回它们的引用,而@[], %{}是用来解引用,得到里面的数据。可以用来构建复杂的数据...

IntermediatePerl(影印版)目录
3. Using Modules: 探讨标准发行版、模块的导入选择、面向对象接口和从 Comprehensive Perl Archive Network (CPAN) 安装模块的方法。4. Introduction to References: 学习如何在多个数组上执行相同任务、引用数组和哈希,以及引用计数和数据结构的复杂性。5. References and Scoping: 介绍多个数据引用,以及...

perl是什么意思?
由于Perl 拥有着灵活的语法,因此使用它可以很轻松地实现从简单的脚本到复杂的应用程序的开发工作。Perl 提供了一些内置的数据类型(如数组和哈希表),可以方便地处理各种数据结构。它还提供了许多优秀的模块和库(如正则表达式处理,socket编程,xml解析等等)来帮助开发者快速完成开发工作。Perl 是一个跨...

perl 如何释放内存
hash = ();@array = ();perl的undef()函数有两个功能: 清除变量的内容,释放变量所占的buffers, 此时你可以近似地认为已经释放了内存。但是注意,实际上并没有真正地释放内存。如果你了解perl的变量在内存里的存放结构,你就会发现,undef后,原变量所在的内存还是被占用的,任然保持着被分配时的...

把perl中hash的values按从大到小排列
上面的那一行就是排序的代码。程序如下:!\/usr\/perl\/bin use strict;use Data::Dumper;my %h=("Alex"=>24,"Sam"=>25,"Bob"=>30,"Andy"=>11,"Wills"=>35,"Mary"=>16,"Helen"=>24 );print(Dumper(\\%h)); # output original hash my @keys = sort { $h{$b} <=> $h{$a} ...

相似回答
大家正在搜