您的位置:首页 > 其它

perl学习笔记-----------------------(3)

2017-04-22 00:00 225 查看
1.Perl的标量代表的是单数,列表和数组代表的是复数

2.列表是标量的有序集、数组是包含列表的变量。

3.列表是指数据,而数组是其变量名。

4.可以有一些值(列表)但不属于数组;但每一个数组标量都有一个列表,虽然其可以为空

5.列表中每一个元素都是一个独立的标量值。这些值是有顺序的,也就是说,这些值从开头到最后一个元素有一个固定的序列。

6.数组或者列表中的元素是编了号的,其索引从整数0 开始,依次增一,因此数组或者列表第一个元素的索引为0。◆数组或者列表在Perl 中的索引总是从0 开始

7.由于每一个元素是一个独立的标量值,因此一个列表或者数组可以包含数字,字符串,undef 值,或者任意不同类型的标量

值的组合。然而,这些元素的类型通常是一致的

8.列表和数组可以包含任意数量的元素。最少含有0 元素,最多可以填满你的可用内存

9.Perl 可以通过索引值来访问元素;数组中的元素是由连续整数编了号的,其从0 开始,每增加一个元素,其索引值加一,如:

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

量。Perl 将它们当作完全不同的事物来看待,不会混淆◆。(但维护人员可能混淆,所以最好不要将它们以相同的名字来命名)。

10.可以在任何能够使用标量变量(如$fred)的地方使用数组元素(如$fred[2])。◆实际上是绝大多数。最明显的例外是foreach 循环中的控制变量(在本章后面将介绍到), 必须是标量变量。还有些例外,如print 和printf的“indirect object slot”和“indirect filehandle slot”。

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

$number = 2.71828;
print $fred[$number-1]; #和print $fred[1]一样
如果下标超出了数组的范围,则其值为undef。这和通常的变量情况是一样的,如果没有值存放在变量中,则其为undef。

$blank = $fred [142_857] #此数组元素未存放值,得到undef
$blanc = $mel; #$mel 未存放值(未初始化),得到undef


12.如果将一个元素存储在数组最后元素的后面的位置,数组会自动增长的。Perl 没有长度的限制,只要你有足够的内存。如

果Perl 需要创建元素,则其值为undef。

13.有时需要知道数组最后一个元素的索引。刚才使用的rocks 数组,其最后一个元素的索引为$#rocks◆。这和数组中元素的

个数是不同的,因为数组中包含元素0。(换句话说,最后一个元素的索引值要比其实际包含的元素个数少一,译者注)。

◆这种糟糕的语法来源于C shell。庆幸的是,在实际的代码中并不常见。

$end = $#rocks; #99,最后一个元素的索引
$number_of_rocks = $end + 1; #正确,但有更好的方法
$rocks[$#rocks] = ‘hard rock’; #the last rock


14.数组的负数索引值从最后一个元素开始。但不要认为这些索引是循环的。如果数组有3 元素,那有效的负数索引值是-1(最后一个元素),-2(中间的元素),-3(第一个元素)。实际上,几乎没有人使用除了-1 之外的其它的负数索引值。

$rocks[-1] = ‘hard rock’; #完成上例中的一种更简单的方法
$dead_rock = ‘rocks[-100]’; #得到‘bedrock’,第0 个元素
$rocks[-200] = ‘crystal’; #严重错误(fatal error!)


15.数组是由括号括起来并且其元素由逗号分隔开的列表。这些值组成了数组的元素:

(1,2,3) #含有1,2,3 的列表
(1,2,3,) #同上,最后一个逗号被忽略
() #空列表-0 个元素
(1 ..100) #包含100 个整数的列表


16.范围操作符(range operator)..,它创建了从左值到右值之间所有值的列表。

(1 ..5) #同(1,2,3,4,5)
(1.7..5.7) #同上— 最小值和最大值被转换成整数
(5 ..1) #空列表— ..中的左值应小于右值,否则为空
(0,2 .. 6,10,12)#同(0,2,3,4,5,6,10,12)
($m ..$n) #由$m 和$n 的值决定
(0 .. $#rocks) #上节中有$#rocks 的介绍


17.列表中的元素并非必须是常数,也可以是在执行此语句时再计算值的表达式:

($m,17) #两个值;$m 的当前值,和17
($m+$o,$p+$q) #两个值


列表可以包含任意的标量值,如下面的包含字符串的例子:

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


18.有一种简便的方法可以不用输入大量的引号而达到类似的功能,那就是使用qw。

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


19. Perl 将qw当作单引号字符串处理不能像双引号那样在qw 中使用\n 和$fred

20.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 >
如后面四个例子中显示的那样,有时两个分界符是可以不同的。如果开分界符有一个对应的闭分界符,那对应的“右”分

界符则为其闭分界符。如果要在字符串中使用闭分界符,很可能选择的分界符并不太恰当。如果不想或者不能改变分界符,那可以使用反斜线(\):

qw!Yahoo\! Google excite lycos ! #其中一个元素为:字符串yahoo!


21.列表值也可以赋给变量:
($fred, $barney, $dino) = (“flintstone”, “rubble”, undef);


22.左边列表中的每一个变量都得到了一个新值,和利用3 个赋值语句得到的结果是一样的。由于列表在赋值之前已经建立,

因此在Perl 中可以使用如下的简单方法交换两个变量的值◆:

◆和C 语言不同,在C 语言中没有完成此类操作的简单方法。C 程序员通常需要使用临时变量,可能是使用宏(macro)来定义的。

($fred, $barney) = ($barney, $fred) #交换两个变量
($betty[0],$betty[1]) = ($betty[1],$betty[0]);


23.在列表赋值中,额外的值会被自动忽略。

因为Perl 认为,如果需要把值存起来,那应当指明其存储的地方。同样,如果有多余的变量,额外的变量被赋予undef◆。

◆对于标量变量这是对的。对于数组变量将得到空的列表,在后面将看到。

($fred, $barney) = qw <flintstone rubble slate granite>; #两个值被忽略了
($wilma,$dino) = qw[flintstone]; #$dino 为undef


24.。在数组名前加@(后没有中括号)来引用整个数组。你可以把他读作“all of the(所有的)”,所以
@rocks 可以读作“all of the rocks(所有的石头)”◆。其在赋值运算符左右均有效:

◆Larry 声称选择美元符号($)和@符号的原因是,可以分别读做$calar(scalar)和@arry(array)。你如果不能按这种方式来记忆,也无所谓。

@rocks = qw / bedrock slate lava /;
@tiny = (); #空表
@giant = 1..1e5; #包含100,000 个元素的表
@stuff = (@giant, undef, @giant); #包含200,001 个元素的表


25.数组不能成为列表的一个元素的原因是数组只能包含标量值,不能包含其它的数组◆。没有赋值的数组变量的值为( ),空表。和

未初始化的标量变量为undef 类似,未被初始化的数组为空表。

26.当将一个数组拷贝到另一个数组时,仍然是列表赋值。如下例:

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


27.数组中使用索引并没有发挥Perl 的威力。如果使用pop, push 和类似的操作符以避免使用索引,那你的程序通常会比大量使用索引的情况要快,而且能避免“差一位(off-by-one)”类型的错误,这类错误通常叫做“边界值错误”

28.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 被丢弃了)


29.如果数组为空,那pop 什么也不做(因为没有元素可以移出),并返回undef。

30.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 个)
push 的第一个参数或者pop 的唯一参数必须是数组变量。


31.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)


和pop 类似,如果其数组变量为空,则返回undef。

32.数组也可以插入双引号的字符串中。插入的数组元素会自动由空格◆分开:

◆分隔符是变量$’’的值,其默认值为空格(space)。

@rocks = qw{ flintstone slate rubble };
print “quartz @rocks limestone\n”; #输出为5 种rocks 由空格分开


33.插入的数组元素的第一个元素前面和最后一个元素后面不会插入空格,如果需要可以自己加入:

print “Three rocks are: @rocks.\n”;
print “There’s nothing in the parens (@empty) here..\n”


34.如果忘了数组插入的规则,当把email 地址插入双引号字符串时可能出现意想不到的结果。因此,“fred@bedrock.edu” 将表示email 地址。但当某人加入了一个变量@bedrock;则这字符串将变成“fred.edu”或者更糟。

$email =“fred@bedrock.edu”; #错误!将会替换@bedrock
$email =“fred\@bedrock.edu”; #正确
$email =‘fred@bedrock.edu’; #另一种方法


35.foreach 从列表的第一个元素一直循环执行到

最后一个元素,一次迭代一个:

foreach $rock (qw/ bedrock slate lava /){
print “One rock is $rock.\n”; #打印出3 种rocks
}


36.控制变量(本例中为$rock)每一次迭代从列表中取出一个新值。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: