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


可以通过使用赋值运算符=将一个表赋值给另一个。如:($a,$b)=($c,$d);用这样的方法,可以将表当作可赋值的实体和左值。这两个表甚至可以包含某些或全部的相同变量:
($a,$b)=($b,$a);

相互赋值的表可以是不同大小的。如:
($a,$b)=(1,2,3);
print $a;

将一个表赋值给标量,将得到该表的最后一个元素:
$a=(2,4,6);
print $a;

数组对表的上下文相当了解,将其赋值给标量时,只是得到了该数组所含元素的数量而不是得到数组的最后一个元素:
@a=(2,4,6);
$a=@a;
print $a;

将标量赋值给表,只有表的第一个元素得到标量的值,其余元素得不到任何赋值,会被设置为undef():
($a,$b,$c)=1;
join函数可以将表中的元素连接成字符串。join EXPR ,LIST;这个函数让expr中的值包含着list里的字符串,然后将它们连接为单个字符串,返回结果为字符串。
print join(" ",qw/Now is the time/);

expr可以拥有多个字符。
perl使用split函数将字符串拆成表:
split /PATTERN/,EXPR,LIMIT;
split /PATTERN/,EXPR
split /PATTERN/
split
split函数在字符串PATTERN出现的每个地方将字符串EXPR分开。如果不指定EXPR,split作用于$_,而如果省掉PATTERN,这个函数在空格处将字符串分开。如果指
定了LIMIT(必须是正数),这个函数将字符串拆成不多于该数的项。
使用map作用于表中的每项。小写函数lc,lc是标量函数,并为设计为使用表。可以使用map函数作用于表中的每项:
map BLOCK LIST
map EXPR,LIST

这个函数为LIST中的每个元素进行BLOCK或EXPR计算(轮流将每个元素设置为$_)。它返回每个计算结果的表。PS:map是表上下文中对BLOCK和EXPR进行计算,所以LIST中的每个元素都可以在返回表中产生一个或多个元素(包括0)。使用表时,这个函数非常方便。如:
print join(", ",(map lc, A,B,C));
chr函数:返回与字符码或表的字符码相对应的字母:
print join(", ",(map chr,65,66,67));
每个元素乘2:
print join(", ",{map {2*$_}1,2,3});
返回表的字符串:
print(map "The current number is:$_\n",(1,2,3))
使用多重语句的表达式:
print join(", ",(map{my $value=$_;$value+=1;}1,2,3));

使用grep寻找符合标准的表项。使用map函数可以对表中的每个元素进行相同的操作。grep可以寻找符合标准的表项,用法如下:
grep BLOCK LIST;
grep EXPR,LIST
这个函数为LIST中的每个元素进行BLOCK或EXPR计算(轮流将每个元素设置为$_),返回由使表达式为真的元素组成的表。PS:在标量环境中,grep返回表达式为真的次数。
BLOCK和EXPR都是在标量下计算的。
grep函数和map函数的不同之处在于,grep返回表的子表,使特定准则为真,然而map函数对表中每个元素的表达式进行求值从主表中创建一个新表,其中包括大于15的项:
print join (", ",(grep {$_>15} (11,12,13,14,15,16,17,18)));

grep函数包含匹配模式。例如,创建了由表中所有非字符x的元素组成的子表:
print join(", ",(grep !/x/,a,b,x,d ));

PS:当grep工作时,grep函数实际返回原始表项的别名。这意味着在grep语句中,对表的一个元素进行修改实际是对原表项进行修改。为了避免修改表,可以先复制该表的一个副本。使用匿名数组编辑器来复制数组中的副本;
@array1=(1,1,1,1);
@array2=grep{$_*=2} @{[@array1]};
print @array1[1];
PS:如果改变grep语句以外的数组里元素,不会有任何问题,如果操作$_的话,只有在grep语句中才能修改原始数组。
使用perl的sort函数对表排序:
sort SUBNAME LIST
sort BLOCK LIST
sort LIST
这个函数对给定的LIST进行排序。SUBNAME给出子程序名,它返回将两个数据项用与运算符<=>和cmp一样的方法进行比较的结果。也可以在BLOCK中放置比较代码。如果不指明SUBNAME或BLOCK,sort用标准字符比较顺序对表排序。
print sort(c,b,a);
在这样一段代码块中使用比较运算符cmp获得同样的结果。注意这个比较中使用了特殊变量$a和$b;这些变量由perl自动填充:
print sort($a cmp $b) (c,b,a);
降序:
print sort($b cmp $a) (c,b,a);

使用数字比较运算符<=>对数字进行比较:
print sort{$a<=>$b}(3,2,1);

在子程序中放一段比较数值得代码:
sub myfunction($$)#@_将原型$$传递给子程序,就无需显示使用$a和$b
{
return (shift(@_) <=> shift(@_));
}
print sort myfunction (3,2,1);
print "\n";
sub myfunctionb
{
return (shift(@_) <=> shift(@_));
}
print sort {myfunctionb($a,$b)} (3,2,1);#显示使用$a和$b


PS:排序包括很多比较,而如果比较子程序所包含大量代码,则会使程序的速度减慢,一个解决办法就是:从作用于数组的子程序中执行所有的计算,首先使用map创建新的数组,然后使用sort对该数组排序,然后再次使用map回到原始数组(map-sort-map排序)
reverse函数可以使表反向排列:
reverse LIST;
print reverse (1,2,3);

强制进入标量环境用scalar函数:scalar EXPR;这个函数强制EXPR被在标量环境下解释。Perl中并不拥有正式运算符来强制让表达式在上下文中解释。如果使用scalar函数,它强制表进入标量环境,那么它返回表的最后一个元素。
print scalar (2,4,6);



转载于:https://my.oschina.net/u/2291665/blog/885107

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值