这里说的是一些常见的内置函数:
time;
返回1970年1月1日起经过的无跳跃秒数。可以用gmtime和localtime函数做进一步的处理。
times;
返回一个四个元素的列表,给出当前进程及其子进程用户和系统时间,精确到秒。
($user,$system,$cuser,$csystem)=times;
在标量上下文中,times返回$user.
localtime EXPER;
把一个由time函数返回的时间转换成一个9个元素的列表,同时把时间按照本地时区转换
典型使用如下:
## 0 1 2 3 4 5 6 7 8
($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst)=localtime(time);
例如:要取得机器当前时间:
$time=localtime;
print $time;
gmtime EXPR;
把一个由time函数返回的时间转换成一个8个元素的列表,同时把该时间转换成标准的格林威治时区时间。
数组函数:
数组函数列表如下:
pop 从数组的末尾删除元素 @values=(1,2,8,14);
$result=pop(@values);#结果是14
print "@values\n";#1 2 8
push 从数组的末尾添加元素 @a=qw(a b c d);#@a是abcd
push@a,e;#@a是abcde
print "@a\n";
shift 从数组的开头删除元素 @a=qw(a b c d);#abcd
shift@a;#bcd print "@a";
unshift 从数组的开头添加元素 @a=qw(a b c d);#abcd
unshift(@a,g)#gabcd print "@a";
reverse 把数组倒序 @values=qw(a b c E d);
@back=reverse(@values); #print "@back\n";
sort 按字典方式排序 @values=qw(a b c E d);
@art=sort@values #print "@art\n";
#实现上面同样目地,但是使用了显式的排序函数@art=sort{$a cmp $b}@values;
#现在是大小写不敏感(忽略大小写) @art=sort{uc($a) cmp uc($b)}@values;
#现在是倒排序 @art=sort{$b cmp $a}@values;
#按数字递增方式排序 @art=sort{$a <=> $b}@values;
#按数字递减方式排序 @art=sort{$b <=> $a}@values;
#现在使用内联函数按照值而不是关键字的方式排序哈希表%sr
%a=(
"www"=>1,
"eee"=>2,
);
@hx=sort{$a{www}<=>$a{eee}}keys%a;
print "@hx\n";
map 是一种道具,可以让你的函数或者表达式,很方便地施用到一系列对象上去。
语法:map BLOCK LIST
map EXPR, LIST
BLOCK是一个用{}包围的代码块。EXPR可以是子函数名、正则表达式等。LIST是输入列表。
简单地说,map就是起了一个替代foreach循环的作用,map会把数组LIST中的元素挨个取出,放到系统变量$_中,然后调用BLOCK去 处理。值得强调的是,除非有很特殊的理由,不要去修改$_的值,因为修改$_就是直接改了原始数组里的元素!BLOCK 处理过的结果由map返回,仍然是一个数组。
一个例子:计算一系列文件大小
my @sizes = map { -s $_ } @filenames;
在一个例子:将数值转换成字符
@number=qw(80 101 114 108);
@characters=map(chr $_, @number); print "@characters\n" 为 Perl
split 语法:split /PATTERN/,EXPR,LIMIT
split /PATTERN/,EXPR
split /PATTERN/
split
分割一个字符串成为一个字符串的列表并返回该列表。分隔符是匹配PATTERN的字符串,因此分隔符长度可能大于一。
一个简单的例子:
$info="Caine:Michael:Actor:14,Leafy Drive";
@perlsonal=split(/:/,$info);
#####@perlsonal=("Caine","Michael","Actor","14,Leafy Drive");
如果想把列表元素中的前后的空格去掉,可以把中间一行改成:
@perlsonal=split(/\s*:\s*/,$info);
缺省情况下,split函数保留开头的空字符串,而删除结尾的空字符串。
grep 语法:
grep BLOCK LIST
grep EXPR,LIST
通常的调用方式是使用一个正则表达式,加上一个数组,但并不局限于此。
对每个传入数组的元素执行BLOCK或EXPR,然后返回由表达式为真的元素组成的数组。在标量上下文,返回表达式为真的次数。
例如,要排除注释行:
@bar=qw(s b c #dd d e);
print "@bar\n";
@foo=grep(!/^#/,@bar);
print "@foo\n";
结果为:s b c #dd d e
s b c d e
或等价的:
@foo=grep{!/^#/}@bar
注意:可以通过$_访问数组元素,当然也可以通过他修改数组元素,但是修改同时也反映到原数组中去了。
scalar 返回数组大小。
@bar=qw(s b c #dd d e);
print scalar@bar; #结果为6;
delete 清除该元素的位置,但不改变各元素的位置。
@bar=qw(s b c #dd d e);
delete $bar[3];
print join(':',@bar); #结果为s:b:c::d:e
exists 判断该元素是否已被删除。
@bar=qw(s b c #dd d e);
delete $bar[3];
print join(':',@bar),"\n" unless exists $bar[3]; #结果s:b:c::d:e;如果没有删除就不打印东西了。
注意:它不同于判断该元素是否undef;
@bar=qw(s b c #dd d e);
undef $bar[3];
print "exists\n" if exists $bar[3]; 结果为:exists
splice 清除该元素的位置。
@bar=qw(s b c #dd d e);
splice(@bar,3,1);
print join(':',@bar),"\n"; #结果为:s:b:c:d:e
undef 让数组变成空白。
chop 每一个元素去掉最后一个字符
@bar=qw(s b c #dd d e);
chop(@bar);
print join(':',@bar),"\n"; #结果为::::#d::
chomp 去掉每一个元素尾部的换行符
比较数组是否相等:
use Array:compare;
@arr1=0..10;
@arr2=0..10;
my $compl=Array::Compare->new;
if($compl->compare(\@arr1,@arr2)){
print "数组是相等的\n";
}else{
print "数组是不同的\n";
}
哈希表
Perl中的哈希表(Hash)用来存储关键字——值对。有的也把它叫做关联数组。哈希表相关的函数列表如下:
keys 返回一个键值的数组。
$ranks{aa}=1;
$ranks{bb}=2;
@teams=keys(%ranks);
print "@teams\n"; #结果teams(aa,bb)或(bb,aa)
values 返回一个值的数组。###用法和上面的一样
each 返回一个“关键字——值”对。随后的调用返回剩下的“关键字——值”对,可用这个函数来遍历hash。
$ranks{aa}=1;
$ranks{bb}=2;
while(($team,$rank)=each(%ranks)){
print ("Ranking for $team is $rank\n");
}#结果为 Ranking for bb is 2
Ranking for aa is 1
delete 从hash删除一个“关键字——值”对,返回被删除的元素的值。
$ranks{aa}=1;
$ranks{bb}=2;
$x=delete $ranks{"aa"};#现在%ranks仅剩一个"关键字---值"对了.
print ("$x\n"); #$x是1
exists 判断该元素是否已被删除。
$ranks{aa}=1;
$ranks{bb}=2;
print ("存在\n")if exists $ranks{aa}; #打印出"存在"。