perl学习(3) 列表
列表或称为数组,和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) 列表的更多相关文章
- Python学习02 列表 List
Python学习02 列表 List Python列表 List Python中的列表(List)用逗号分隔,方括号包围(comma-separated values (items) between ...
- perl 学习笔记
一:基础 1:安装perl centos: yum -y install perl 官网:https://www.perl.org/ 升级到5.22:先下载,执行./i ...
- redis学习-散列表常用命令(hash)
redis学习-散列表常用命令(hash) hset,hmset:给指定散列表插入一个或者多个键值对 hget,hmget:获取指定散列表一个或者多个键值对的值 hgetall:获取所欲哦键值以及 ...
- 《python基础教程(第二版)》学习笔记 列表/元组(第2章)
<python基础教程(第二版)>学习笔记 列表/元组(第2章)序列中的下标从0开始x='ABC' ==> x[0]='A', x[1]='B', x[2]='C'负数索引从右边开始 ...
- perl学习之I/O基础
1.从标准输入进行输入<STDIN> 2.从钻石操作符进行输入<> 3.参数调用@ARGV 4.向标准输出进行输出 5.用printf进行格式化输出 1.<STDIN&g ...
- Perl 学习笔记-列表和数组
笔记来自<<Perl语言入门第5版>> 1. Perl中列表指标量的有序集合,数组则是存储列表的变量, 这两个术语经常混用,不过更精确地说,列表指数据,而数组指变量.数组的表示 ...
- perl学习之五:列表和数组
列表及其形式 数组 数组的赋值 数组的读取 数组片段 数组函数 二维数组简介 总结 1.列表形式: 1.(item1,item2,...) 2.qw(item1 item2 item3 ...) 3. ...
- perl学习之路3
Perl编程之路3 标签: perl 列表与数组 Perl里面代表复数的就是列表和数组 列表(list)指的是标量的有序集合, 而数组(array)则是存储列表的变量. 在Perl这两个属于尝尝混 ...
- perl学习之路1
一切要从Hollo world开始 公司要用perl....啊, 不会只能自学了, 毕竟是公司啊, 不是学校...公司不学习就滚蛋了...惨惨惨 因为是学习嘛, 感觉开虚拟机比较麻烦所以直接用了个 瘟 ...
随机推荐
- c++11新特性(4) lambda捕捉块
lambda表达式中的方括号成为捕捉块,能够在这里指定怎样从所在的作用域中捕捉变量. 捕捉的意思是指能够在该lambda中使用该变量.即能够捕获外部变量在lambda表达式内使用. 能够使用两种方式来 ...
- #pragma的用法
在所有的预处理指令中,#Pragma 指令可能是最复杂的了,它的作用是设定编译器的状态或者是指示编译器完成一些特定的动作.#pragma指令对每个编译器给出了一个方法,在保持与C和 C++语言完全 ...
- JavaSE复习日记 : 算是个小前言吧
/* * Java也学了好久了,抽个时间整理了一下课堂笔记,也有些是我刚开始学会犯的一些错误.在这里浅谈一下JavaSE的基础内容,对我来说也是一种不错的复习方式. * * 那好,对于初学者来说,学习 ...
- Ajax学习之小结
ajax: * 同步交互和异步交互: * 同步交互:客户端发送请求——>等待服务器端处理——>接收响应,这个过程客户端不能做任何其他事情,这种模式叫做同步交互 * 异步交互:客户端发送 ...
- 【转】20个令人敬畏的jQuery插件
为网页设计师和开发推荐20个令人敬畏的jQuery插件.例如滑块,图像画廊,幻灯片插件,jQuery的导航菜单,jQuery文件上传,图像旋转器,标签的插件,用户界面元素,网络接触形式,模态窗口, ...
- 一次搞懂 Assets Pipeline 转载自http://gogojimmy.net/2012/07/03/understand-assets-pipline/
Assets Pipeline 是 Rails 3.1 一個重要的功能,一直並沒有很去了解其特性,但因為最近都在寫前端的東西在 assets pipeline 的東西上跌跌撞撞了不少次(尤其在 dep ...
- PSAM卡
PSAM卡 终端安全控制模块,符合<中国金融集成电路(IC卡)PSAM卡规范>, 包括普通PSAM卡和高速PSAM卡. PSAM符合以下标准及规范: 识别卡,带触点的集成电路卡标 ...
- Qt的“undefined reference to `vtable for”错误解决(手动解决,加深理解)
使用QT编程时,当用户自定义了一个类,只要类中使用了信号或槽. Code::Blocks编译就会报错(undefined reference to `vtable for). Google上有很多这个 ...
- javascript 变量 命名规范 变量的作用域
原文:javascript 变量 命名规范 变量的作用域 大家好,我是小强老师,今天讲解的是变量 变量 小时候我们学过 这个 应用题 : X+1=2; 问 X 等于几? 答案是 1 对了,很聪 ...
- TCP/IP笔记 三.运输层(4)——TCP链接管理与TCP状态机
1. 建立连接 三次握手 (1)A 的 TCP 向 B 发出连接请求报文段,其首部中的同步比特 SYN 应置为 1,并选择序号 x,表明传送数据时的第一个数据字节的序号是 x. (2)B 的 TCP ...