列表或称为数组,和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. c# 获取全屏 中鼠标焦点的位置坐标

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.D ...

  2. linux之多进程fork:进程通信

    ++++++++++++++++++信号机制+++++++++++++++++++ 接收信号 int signal(int sig,__sighandler_t handler); int func( ...

  3. eclipse或adt-bundle创建的android项目没有自动生成MainActivity.java和activity_main.xml等文件解决办法

    以前我电脑一直以来都是用的eclipse3.7来开发android项目的,创建android项目也能正常生成MainActivity.java和activity_main.xml等文件.后来不知道什么 ...

  4. Find the k-th Smallest Element in the Union of Two Sorted Arrays

    (http://leetcode.com/2011/01/find-k-th-smallest-element-in-union-of.html) Given two sorted arrays A, ...

  5. ThinkPHP第十三天(CONF_PATH、APP_PATH,UEditor用法)

    1.CONF_PATH 项目配置文件目录地址,APP_PATH 项目地址 2.ThinkPHP中更新数据的连接操作位save(),更新一个字段可以用setField(name,value)方法. 3. ...

  6. verilog中连续性赋值中的延时

    上次遇到一个问题.写一个testbench需要移动两个时钟之间的相位.后来一想,貌似我们都是这么写clock的 always    #(`P/2) clk = ~clk 我的两个时钟都是这么写,只是p ...

  7. Delphi中的“委托”

    .NET中有委托(Delegate)的概念,其声明形式如下所示:     public delegate void MyDelegate(int aIntParam, string aStringPa ...

  8. Android Studio 新建项目的R文件丢失的解决方法

    最近Android Studio炒的比较热,于是笔者决定赶赶时髦,从Eclipse转到了Android Studio.不幸的是,用Android Studio创建项目的时候就遇到了一个比较尖锐的问题— ...

  9. Session()

    如何使用 Session Java Api 只给我们一种方式来 获取 当前会话相关的 session: HttpSession session = request.getSession(); //或 ...

  10. Java算法——O(n)查询数列中出现超过半数的元素

    主要思想: 相邻元素两两比较,如果相同存入新数组,不同二者都删除.如果 某数出现次数超高n/2,则最后剩下的1元素为所求. public static int findMostElem(final A ...