Perl Learning (3_1) —— 列表与数组

2011-01-19 wcdj

 

(1) 列表与数组
(2) 访问数组中的元素
(3) 特殊的数组索引值
(4) 列表直接量
(5) qw简写
(6) 列表的赋值
(7) pop和push操作符
(8) shift和unshift操作符
(9) 字符串中的数组内插
(10) foreach控制结构
(11) Perl的“老地方”:$_
(12) reverse操作符
(13) sort操作符

(1) 列表与数组
如果说Perl的标量代表的是单数(singular),那么在Perl里代表复数(plural)的就是列表和数组。
列表(list):指的是标量的有序集合。
数组(array):指的是存储列表的变量。
更精确地说:列表指的是——数据;而数组指的是——变量。
注意:
[1] 列表的值不一定要放在数组里,但每个数组变量都一定包含一个列表(即使该列表可能是空的)。
[2] 数组和列表中的每个元素(element)都是单独的标量变量,拥有独立的标量值。
[3] 每个元素都是独立不相关的标量值,所以列表或数组可能包含数字、字符串、undef值或是不同类型标量值的混合。不过最常见的,还是让所有元素都具有相同的类型。
[4] 数组和列表可以包含任意多个元素。最少的情况是没有任何元素;最多的情况则是把可用的内存全部塞满。(Perl“去除不必要限制”的原则)

(2) 访问数组中的元素
数组元素是以连续的整数来编号,从0开始,之后的每一个元素依次加1。
注意:
[1] 数组的名字空间和标量的名字空间,是完全分开的。(C里是不允许的!在Perl中也不建议这样做)
例如:
$a[0]="wcdj";
$a[1]="gerry";
$a="yj";
print "$a[0],$a[1],$a";# 输出:wcdj,gerry,yj
[2] 如果下标是小数,则下标会自动舍去小数,无论正负。
例如:
$a[0]="wcdj";
$a[1]="gerry";
$a="yj";
print "$a[0],$a[1],$a/n";
$number=1.14;
print $a[$number];# 输出:gerry
[3] 如果下标超出数组的尾端,则对应的值将会是undef。

(3) 特殊的数组索引值
如果你对索引值超过数组尾端的元素进行赋值,数组将会根据需要自动扩大。
例如:
$a[0]="1";# 一个元素
$a[1]="2"# 又一个
#a[4]="5"# 现在有2个undef元素
注意:
[1] 最后一个元素的索引值是:$#a。
$end=$#a;
$number_of_a=$end+1;
[2] 从数组尾端往回计数的“负数数组索引值”。超过数组大小的负数索引值是不会绕回来的。
-1是最后一个元素的索引,-2是倒数第二个元素的索引,……

(4) 列表直接量

 

(5) qw简写
在Perl程序里,经常需要建立简单的单词列表。这时只需使用qw简写,就不必键入许多索然无味的引号。

注意:
[1] 在qw构建的列表中,Perl都会将其当成单引号内的字符串来处理。
[2] 在qw构建的列表中,其中的空白字符(如空格、制表符以及换行符)会被抛弃,然后剩下的就是列表的元素。
[3] 因为qw算是一种引号,所以不能将注释放在qw列表中。
[4] Perl还允许你使用任何标点符号作为定界符(delimiter)。这符合Perl的座右铭“办法不止一种 (There's More Than One Way To Do It)”。

 

(6) 列表的赋值
注意:
[1] 就像标量值可被赋值给变量一样,列表值也可以赋值到变量。
($a,$b,$c)=(1,2,3);
@list9=($a,$b,$c);
print "@list9";# 1 2 3
[2] 在Perl里互换两个变量的值相当容易。
$a=1;
$b=2;
($a,$b)=($b,$a);    # 互换两者的值
print "$a,$b";    # 2,1
[3] 在Perl里,要引用整个数组时,只要在数组名之前加上@字符。

 

(7) pop和push操作符
“右”-> “结尾”:
pop—删除。用来取出数组中最后一个元素,同时返回该元素的值。
push—加入。用于添加一个元素(或是一串元素)到数组的尾端。

 

(8) shift和unshift操作符
“左”-> “开头”:
shift—删除。用来取出数组中开头一个元素,同时返回该元素的值。
unshift—加入。用于添加一个元素(或是一串元素)到数组的开头。

 

(9) 字符串中的数组内插
和标量一样,数组的内容同样可以被内插到双引号串中。内插时,会在数组的各个元素之间自动添加分割用的空格。
@name=qw{wcdj gerry yj};
print "name:@name/n";#name:wcdj gerry yj
注意:索引表达式(index expression)会被当成普通字符串表达式处理。该表达式中的变量不会内插。

(10) foreach控制结构
foreach循环能逐项遍历列表中的值,依次迭代。
foreach $name (qw/wcdj gerry yj/) {
    print "One name is $name/n";
}
注意:控制变量并不是列表元素的复制品——实际上,它就是列表元素本身。
@array=qw/wcdj gerry yj/;
foreach $name (@array) {
    print "One name is $name/n";
    $name .= _n;
}
print "@array/n";# wcdj_n gerry_n yj_n

(11) Perl的“老地方”:$_
假如你在foreach循环的开头省略了控制变量,Perl就会使用它的“老地方”变量$_。
foreach (1..10) { # 默认会用$_迭代
    print "I can count to $_!/n";
}
注意:在许多情况下,当未告知Perl使用哪个变量或数值时,Perl都会自动使用$_,从而使程序员免于命名(和键入)新变量的痛苦。
例如:
$_="Hello everyone!/n";
print;# 默认打印$_

(12) reverse操作符
reverse操作符会读取列表的值(可能来自数组),并按相反的次序返回该列表。
注意:reverse会返回次序相反的列表,但它并不会修改传进来的参数。假如返回值无处可去,那这种操作也就变得毫无意义。
例如:
@array=1..5;
print "@array/n";# 1 2 3 4 5
@array=reverse(@array);
print "@array/n";# 5 4 3 2 1

(13) sort操作符
sort操作符会读取列表的值(可能来自数组),而且会根据内部的字符编码的顺序,对它们进行排序。
@array=1..5;
print "@array/n";# 1 2 3 4 5
@array=reverse(@array);
print "@array/n";# 5 4 3 2 1
@array=sort(@array);
print "@array/n";# 1 2 3 4 5

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值