列表或称为数组,和c语言中的数据类似,只是perl自己特殊的一些写法。

1.1.定义

一个列表或者数组可以包含数字,字符串,undef 值,或者任意不同类型的标量值的组合,但是这些元素的类型通常是一致的。

数组下标:

·    数组中的元素是由连续整数编了号的,其从0 开始;

·    下标可以是任何能返回数值的表达式。如果其值不为整数,则自动将其转换为小于它的最大整数值。

·    如果下标超出了数组的范围,则其值为undef。这和通常的变量情况是一样的,如果没有值存放在变量中,则其为undef。

·    如果将一个元素存储在数组最后元素的后面的位置,数组会自动增长的

$rocks[0] = ‘slate’; #又一个

$rocks[1] = ‘lava’; #又一个

$rocks[2] = ‘crushed rock’;#又一个

$rocks[99] = ‘schist’; #现在有96 个undef 元素

·      数组的负数索引值从最后一个元素开始,$#name 返回最后一个元素的索引。

$rocks[-1] = ‘hard rock’;      #完成上例中的一种更简单的方法

$dead_rock = ‘rocks[-100]’; #得到‘bedrock’,第0 个元素

$rocks[-200] = ‘crystal’;       #严重错误(fatal error!)

$#rocks = 99

(0,2 .. 6,10,12)  #同(0,2,3,4,5,6,10,12)

($m ..$n)        #由$m 和$n 的值决定

($m+$o,$p+$q) #两个值

(“fred”, “barney”, “betty”, “wilma”, “dino”)

qw(fred barney betty wilma dino )       #同上,但输入更少

qw ! fred barney betty wilma dino !

qw# fred barney betty wilma dino # #有些像注释

qw( fred barney betty wilma dino )

qw{ fred barney betty wilma dino }

qw[ fred barney betty wilma dino ]

qw< fred barney betty wilma dino >

1.2.列表赋值

($fred, $barney, $dino) = (“flintstone”, “rubble”, undef);

($fred, $barney) = ($barney, $fred) #交换两个变量

引用这个数组时,Perl 有一种简单的写法,在数组名前加@(后没有中括号)来引用整个数组

@rocks = qw / bedrock slate lava /;

@tiny = (); #空表

@giant = 1..1e5; #包含1到105元素的表

@stuff = (@giant, undef, @giant); #包含200,001 个元素的表

@dino = “granite”;

@quarry = (@rocks, “crushed rock”, @tiny, $dino);

最后一个赋值语句将五个元素(bedrock, slate, lava, crushed, rock, granite)赋给变量@quarry,因为@tiny 没有元素。

特别的是,它没有undef 这个值,但可以像@stuff 那样明确的指定它。

还有一点需要注意的是数组名字被其列表值替换。

数组不能成为列表的一个元素的原因是数组只能包含标量值,不能包含其它的数组。

没有赋值的数组变量的值为( ),空表。和未初始化的标量变量为undef 类似,未被初始化的数组为空表。

@copy = @quarry; #将一个数组中的值拷贝的另一个数组中

1.3.插入和删除

Perl 程序员不使用索引,介绍几种不使用索引来操作数组的方法:

通常将数组类似于栈来使用,在其右边添加或者删除数据

pop 操作将数组的最后一个元素取出并返回;

@array = 5..9;

$fred = pop(@array); #$fred 得到9,@array 现在为(5,6,7,8)

push,它可以将一个元素(或者一列元素)加在数组的末尾:

@array = 5..6 ;

push(@array,0); #@array 现在为(5,6,0)

push @array,8; #@array 现在为(5,6,0,8)

push @array,1..10; #@array 现在多了10 个元素

@others =qw/9 0 2 1 0 /;

push @array,@others; #@array 现在又多了5 个元素(共有19 个)

unshift 和shift 对一个数组的开头进行操作(数组的左端有最小下标的元素)

@array = qw# dino fred barney #;

$m = shift (@array);      #$m 得到“dino”, @array 现在为(“fred”, “barney”)

$n = shift @array;         #$n 得到”fred”, @array 现在为(“barney”)

shift @array;                 #@array 现在为空

$o = shift @array;         #$o 得到undef, @arry 仍为空

unshift(@array,5);         #@array 现在为(5)

unshift @array,4;           #@array 现在为(4,5)

@others = 1..3;

unshift @array, @others;       #array 现在为(1,2,3,4,5)

和标量类似,数组也可以插入双引号的字符串中。插入的"数组元素"会自动由空格分开,插入的数组元素的第一个元素前面和最后一个元素后面不会插入空格,如果需要可以自己加入.

1.4.遍历

foreach 从列表的第一个元素一直循环执行到最后一个元素,一次迭代一个

控制变量不是这些列表元素中的一个拷贝而是这些元素本身。也就是说,如果在循环中修改这个变量,那原始列表中的元素也会被修改.

#! /usr/bin/perl

foreach $color(qw [red yellow block white])

{

        print "$color\n" ;

}

#

@rocks = qw/ bedrock slate lava /;

print "before foreach ,The rocks are:\n@rocks\n";

foreach $rock(@rocks){

        $rock ="\t$rock"; #@rocks 的每一个元素前加入一个tab

        $rock .= "\n"; #每一个元素后加一个换行符

        print "in foreach ,the rock is :$rock \n" ;

}

print "after foreach, The rocks are:\n@rocks";

程序结果:

如果在foreach 循环中省略了控制变量,那Perl 会使用其默认的变量:$_

foreach(1..10){ #使用默认的变量$_

print “I can count to $_!\n”;

}

#遍历

foreach(0..$#rocks)

{

print "$rocks[$_]";

}

1.5.排序

sort 操作将输入的一串列表(可能是数组)根据内部的字符顺序进行排序。如对于ASCII 字符串,将根据ASCII 序进行排

序。当然,ASCII 中有一些奇怪的地方,如大写字母在小写字符的前面,数字在字符的前面,而标点符号散布在各处。

#! /usr/bin/perl

@list = qw {111 2 test Test HUNAN 9 10} ;

@list = sort(@list);

foreach (@list)

{

print "$_\n";

}

1.6.其他函数

reverse(逆转)操作将输入的一串列表(可能是数组)按相反的顺序返回。

@fred = 6 ..10;

@barney = reverse (@fred); #得到10,9,8,7,6

1.7.标量和列表

标量就是【c】变量

列表就是【c】数组

Perl 中的表达式将根据其context 返回适当的值,列表or标量,例如,一个数组的“name”,在列表context 中,它返回列表元素;在标量context 中,它返回数组元素的个数。

@people = qw( fred barney betty );

@sorted = sort @people; #列表context:barney , betty, fred

$number = 42 + @people; #标量context:42+3,得到45

$fred = something; # 标量context

@pebbles = something; #列表context

($wilma,$betty) = something; #列表context

($dino) = something;     #列表context,dino取列表中的第一个值

下面是一些标量context:

$fred = something;

$fred[3] = something;

123 + something;

something + 654

if(something){… }

$fred[something] = something;

下面是一些列表context:

@fred = something;

($fred, $barney) = something;

($fred) = something;

push @fred, something;

foreach $fred(something)

sort something

reverse something

print something

偶尔你可能需要标量context而Perl 期望的是列表。这种情况下,可以使用函数scalar。它不是一个真实的函数因为其仅是告诉Perl 提供一个标量context

@rocks = qw(talc quartz jade obsidian);

print “How many rocks do you have?\n”;

print “I have ”, @rocks, “rocks!\n”; #错误,输出rocks 的名字

print “I have ”, scalar @rocks, “rocks!\n”; #正确,输出其数字

perl学习(3) 列表的更多相关文章

  1. Python学习02 列表 List

    Python学习02 列表 List Python列表 List Python中的列表(List)用逗号分隔,方括号包围(comma-separated values (items) between ...

  2. perl 学习笔记

    一:基础 1:安装perl      centos: yum -y install perl       官网:https://www.perl.org/      升级到5.22:先下载,执行./i ...

  3. redis学习-散列表常用命令(hash)

    redis学习-散列表常用命令(hash)   hset,hmset:给指定散列表插入一个或者多个键值对 hget,hmget:获取指定散列表一个或者多个键值对的值 hgetall:获取所欲哦键值以及 ...

  4. 《python基础教程(第二版)》学习笔记 列表/元组(第2章)

    <python基础教程(第二版)>学习笔记 列表/元组(第2章)序列中的下标从0开始x='ABC' ==> x[0]='A', x[1]='B', x[2]='C'负数索引从右边开始 ...

  5. perl学习之I/O基础

    1.从标准输入进行输入<STDIN> 2.从钻石操作符进行输入<> 3.参数调用@ARGV 4.向标准输出进行输出 5.用printf进行格式化输出 1.<STDIN&g ...

  6. Perl 学习笔记-列表和数组

    笔记来自<<Perl语言入门第5版>> 1. Perl中列表指标量的有序集合,数组则是存储列表的变量, 这两个术语经常混用,不过更精确地说,列表指数据,而数组指变量.数组的表示 ...

  7. perl学习之五:列表和数组

    列表及其形式 数组 数组的赋值 数组的读取 数组片段 数组函数 二维数组简介 总结 1.列表形式: 1.(item1,item2,...) 2.qw(item1 item2 item3 ...) 3. ...

  8. perl学习之路3

    Perl编程之路3 标签: perl 列表与数组   Perl里面代表复数的就是列表和数组 列表(list)指的是标量的有序集合, 而数组(array)则是存储列表的变量. 在Perl这两个属于尝尝混 ...

  9. perl学习之路1

    一切要从Hollo world开始 公司要用perl....啊, 不会只能自学了, 毕竟是公司啊, 不是学校...公司不学习就滚蛋了...惨惨惨 因为是学习嘛, 感觉开虚拟机比较麻烦所以直接用了个 瘟 ...

随机推荐

  1. java面试核心基础(1)

    1.以下代码的执行结果 String s1 = "helloworld"; String s2 = "hello" + new Stirng("wor ...

  2. SQL Server索引进阶:第五级,包含列

    原文地址: Stairway to SQL Server Indexes: Level 5, Included Columns 本文是SQL Server索引进阶系列(Stairway to SQL ...

  3. 使用coding.net来托管源码(可以免费存放私有项目的哦)(转载)

    coding.net是国内新兴的一个项目管理平台,功能主要包括:代码托管.在线运行环境.监控代码质量,兼有一定的社交功能.在线运行环境支持Java.Ruby.Node.js.PHP.Python.Go ...

  4. ##DAY2 UILabel、UITextField、UIButton、UIImageView、UISlider

    ##DAY2 UILabel.UITextField.UIButton.UIImageView.UISlider #pragma mark ———————UILabel——————————— UILa ...

  5. C++之构造函数重载

    #include<stdio.h> class Test    {        private:         int i;         int j;         int k; ...

  6. ThinkPHP第十八天(Widget类的使用,连贯操作where IN用法,缓存S函数使用)

    1.Widget类的使用方法: 第一步:在Action同级目录中新建Widget文件夹(独立分组需要自己建立) 第二步:根据不同功能在Widget文件夹中建立不同的Widget类,如热门文章HotWi ...

  7. document.createElement在IE和Firefox下的差异

    IE有3种方式都可以创建一个元素: 1 document.createElement("<input type=text>") 2 document.createEle ...

  8. qt数据库多线程问题的解决(QSqlDatabase只能在创建它的线程中使用)

    Qt数据库由QSqlDatabase::addDatabase()生成的QSqlDatabase只能在创建它的线程中使用, 在多线程中共用连接或者在另外一个线程中创建query都是不支持的几乎国内没有 ...

  9. mac 下安装和卸载 mysql

    这里有一篇文章写得很详细: http://www.cnblogs.com/macro-cheng/archive/2011/10/25/mysql-001.html 关于卸载,我也百度了下.找了好几个 ...

  10. uva11536 Smallest Sub-Array

    Thinking about it: 我的思路跟sliding window有点类似.假设已经确定了一个区间[l, r],序列中从 l 到 r 恰好包含了[1, K]的各个元素,则从 r 开始继续迭代 ...