Per语言入门第4版学习笔记-第三章列表和数组

第三章列表和数组

3.1 访问数组元素
3.2 特殊的数组索引
3.3 列表
3.3.1 qw 简写
3.4 列表赋值
3.4.1 pop 和push 操作
3.4.2 shift 和unshift 操作
3.5 将数组插入字符串
3.6 foreach 控制结构
3.6.1 Perl 最常用的默认变量:$_
3.6.2 reverse 操作
3.6.3 sort 操作
3.7 标量和列表上下文
3.7.1 在标量Context 中使用List-Producing 表达式
3.7.2 在列表Context 中使用Scalar-Producing 表达式
3.7.3 强制转换为标量Context
3.8 在列表Context 中
3.9 练习

[@more@]

第三章列表和数组
列表是标量的有序集。数组是包含列表的变量。在Perl 中这个两个术语是可以互换的。但严格意义上讲,列表是指数据,而数组是其变量名。
列表和数组可以包含任意数量的元素。最少含有0 元素,最多可以填满你的可用内存。这里又体现了Perl 的设计哲学,“没有不必要的限制”。

3.1 访问数组元素
$fred[0] = “yabba”;
$fred[1]= “dabba”;
$fred[2] = “doo”;
数组名字(本例中:fred)和标量是属于完全不同的命名空间(namespace)。同一程序也可以同时包含叫做$fred 的标量变量。

如果下标超出了数组的范围,则其值为undef。

3.2 特殊的数组索引
$end = $#rocks; 可以获取rocks数组的个数
还可以用负数来访问数组 -1(最后一个元素),-2(中间的元素),-3(第一个元素)


3.3 列表
数组是由括号括起来并且其元素由逗号分隔开的列表。
列表中的元素并非必须是常数,也可以是在执行此语句时再计算值的表达式
列表可以包含任意的标量值
(1,2,3) #含有1,2,3 的列表
(1,2,3,) #同上,最后一个逗号被忽略
() #空列表-0 个元素
(1 ..100) #包含100 个整数的列表

3.3.1 qw 简写
qw 表示“quoted words”或者“quoted by whitespace,”
(“fred”, “barney”, “betty”, “wilma”, “dino”) 可以写成 qw(fred barney betty wilma dino )

但Perl 允许使用任何标点符号作为分界符。下面是一些常用的类型:
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 >

如果要在字符串中使用闭分界符,很可能选择的分界符并不太恰当。如果不想或者不能改变分界符,那可以使用反斜线():
我们处理Unix 中的文件名:
blei@163.com 42 / 201 9/21/2006
qw{
/usr/dict/words
/home/rootbeer/.ispell_english
}


3.4 列表赋值
列表值也可以赋给变量:
($fred, $barney, $dino) = (“flintstone”, “rubble”, undef);
($fred, $barney) = ($barney, $fred) #交换两个变量

在数组名前加@(后没有中括号)来引用整个数组。
@rocks = qw / bedrock slate lava /;
@tiny = (); #空表
@giant = 1..1e5; #包含100,000 个元素的表
@stuff = (@giant, undef, @giant); #包含200,001 个元素的表

当将一个数组拷贝到另一个数组时,仍然是列表赋值。如下例:
@copy = @quarry; #将一个数组中的值拷贝的另一个数组中

3.4.1 pop 和push 操作
pop 操作将数组的最后一个元素取出并返回:
@array = 5..9;
$fred = pop(@array); #$fred 得到9,@array 现在为(5,6,7,8)
$barney = pop @array; #$barney gets 8, @array 现在为(5,6,7)
pop @array; #@array 现在为(5,6)(7 被丢弃了)

push,它可以将一个元素(或者一列元素)加在数组的末尾:
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 个)

3.4.2 shift 和unshift 操作
push 和pop 对数组的末尾进行操作(或者说数组右边有最大下标的元素,这依赖于你是怎样思考的)。相应的,unshift 和 shift 对一个数组的开头进行操作(数组的左端有最小下标的元素)

3.5 将数组插入字符串
和标量类似,数组也可以插入双引号的字符串中。
当把email 地址插入双引号字符串时可能出现意想不到的结果。
$email =“fred@bedrock.edu”; #错误!将会替换@bedrock
$email =“fred@bedrock.edu”; #正确
$email =‘fred@bedrock.edu’; #另一种方法

@fred = qw(hello dolly);
$y = 2;
$x =“This is $fred[1]’s place”; # “This is dolly’s place”
$x =“This is $fred[$y-1]’s place”; #同上
索引表达式被当作普通表达式求值,看起来和不在字符串中是一样的。其变量不会首先被赋值的。换句话说,如果$y 为“2*4”,那上述表达式的值为1,而非7,因为“2*4”首先当作数字时($y 在数字表达式中)为2

3.6 foreach 控制结构
foreach $rock (qw/ bedrock slate lava /){
print “One rock is $rock.n”; #打印出3 种rocks
}
控制变量不是这些列表元素中的一个拷贝而是这些元素本身。也就是说,如果在循环中修改这个变量,那原始列表中的元素也会被修改,
循环结束时,变量的值会回到循环开始前,如果没有值则为undef。

3.6.1 Perl 最常用的默认变量:$_
当没有指定变量的时候,就会使用默认的变量:$_

foreach(1..10){ #使用默认的变量$_
print “I can count to $_!n”;
}

$_ =“Yabba dabba doon”;
print; #打印出默认变量$_。


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

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


3.7 标量和列表上下文

3.7.1 在标量Context 中使用List-Producing 表达式

3.7.2 在列表Context 中使用Scalar-Producing 表达式

3.7.3 强制转换为标量Context

3.8 在列表Context 中
@lines = ; #将输入读入列表context 中
在Unix 或者类似的系统中,包括linux, Mac OS X,通常可以输入CTRL +D 来表明输入已经结束。Perl 会忽略这个字符,因此它将在屏幕上显示出来。在DOS/WINDOWS 系统中,使用CTRL +Z。
chomp (@lines = ); #读入所有的行,不包括换行符当

3.9 练习
1. [6] 写一个程序,将一些字符串(不同的行)读入一个列表中,逆向输出它。如果是从键盘输入的,那在Unix 系统中
应当使用CTRL+D 表明end-of-file,在Windows 系统中使用CTRL+Z.
2. [12] 写一个程序,读入一串数字(一个数字一行),将和这些数字对应的人名(下面列出的)输出来。(将下面的人
名列表写入代码中)。例如,当输入为1,2,4 和2,则输出的为fred, betty, dino, 和betty:
fred betty barney dino Wilma pebbles bamm-bamm
3. [8]写一个程序,将一些字符串(在不同的行中)读入一个列表中。然后按ASCII 顺序将它们输出来。也就是说,当输
入的字符串为fred, barney, wilma, betty,则输出为barney betty fred wilma。分别在一行或不同的行将之输出。

1.
#!/usr/bin/perl
chomp(@a=);
@a=reverse(@a);
print @a;

2.
#!/usr/bin/perl
@b=qw (fred betty barney dino Wilma pebbles bamm-bamm);
chomp(@a=);
foreach $num (@a) {
print "$num : ".$b[$num-1]."n";
}

3.
#!/usr/bin/perl
chomp(@a=);
print sort(@a);

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/133835/viewspace-1024989/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/133835/viewspace-1024989/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值