Perl学习总结
Posted 生物文摘
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Perl学习总结相关的知识,希望对你有一定的参考价值。
1 语法简介
1.1 逻辑语句(语法类似C语言)
if if-elseif for foreach while do-while unlesslast=break@c语言next=continue@c语言 returnexit ( 在操作数组的时候, for 与 foreach 是一样的.)
1.2 函数
sub function{} 定义子过程(函数)
sub test {
print "hello\n";
}
调用时: &test; &test();或者 test(),;
如:&add_a_b(2,3)
在子函数中如果没有用 return 显式返回,那么最后一个表达式的值将返回;
匿名函数
$func = sub { print "hehe\n" };
使用: &$func(); 或 $func->();
1.3 引用/指针
3.1.3 引用/指针
$x = 5; $ref = \$x; print $$ref;
$x = 12; $ref = \\$x; print $$$ref;
sub func { print "hehe\n" }
$ref = \&func;
$ref->(); # or &$ref();
1.4 特殊变量
$_ @_ 函数参数 @ARGV命令行参数
1.5 注释
一般来说, 在 # 后的都是注释. (例如 $a = q#hello#; 就不算是注释),如果要注释块, 使用 =head 和 =cut, 如
=head
注释块....
=cut
1.6 <STDIN> 标准输入
指令:print
语法:print Filehandle LIST
说明:这个Filehandle 可以看作在I(INPUT)/O(OUTPUT) 之间的一个桥梁,可以利用FILEHANDLE 来做出数据读入写出的动作。STDIN 是代表从哪里输入数据,例如从电脑的键盘输入;STDOUT是代表从哪里输出数据,例如从电脑的屏幕输出;STDERR 是代表从哪里输出错误的数据,例如从电脑的屏幕输出。而在PERL语言中有三个标准FILEHANDLE:
1. STDIN(标准输入):是代表 STDIN 的 FILEHANDLE
2. STDOUT(标准输出):是代表 STDOUT 的 FILEHANDLE
3. STDERR(标准错误输出):是代表 STDERR 的 FILEHANDLE
如果要使用其他 FILEHANDLE 的时候,就要先用 OPEN 这个函数来打开一个FILEHANDLE,我们可以用 PRINT 这个函数将 LIST 中的数据输出给 FILEHANDLE。
$line = <>;
print $line,"\n";
在 @ARGV 为空时, <> 等价于 <STDIN>, 即从标准输入读入,而如果存在 @ARGV 呢? 那么 <> 会把 @ARGV 的元素当成文件,并且打开它们, 然后一行一行的读:
$ perl t.pl tmpfile
while (<>) {
print;
}
$ perl t.pl tmpfile.?
并且, perl 把当前的文件名放到变量 $ARGV 中:
while (<>) {
print "$ARGV: $_";
}
1.7 改变默认的输出句柄
默认情况下,如果不指定文件句柄给print(或者printf,这里的内容对两者均适用),则默认会使用STDOUT。但这个默认属性,可以通过select 操作进行更改。如下:
select BEDROCK;
print “I hopeMr. Slate doesn’t find out about this.\n”;
print“Wilma!\n”;
一旦选择了(select)了某个文件句柄,则它将变成默认值。但这通常是一个坏主意,因为会扰乱程序的剩余部分,因此在完成时应当恢复以前的设置◆。默认情况,输出到文件句柄的内容会被缓存起来。将变量$|设置为1,将会在输出操作结束时会立刻清空文件句柄。如果想确保logfile 能立刻得到消息,以便能观察程序的运行情况,可以使用下面的程序:
select LOG;
$| = 1; #don’tkeep LOG entries sitting in the buffer
select STDOUT;
#...time passes,babies learn to work, tectonic plates shift, and then … .
print LOG “Thisgets written to the LOG at once!\n”;
1.8 调用外部程序
$str = ` command `;
system($str);
exec($str);
我们知道, 在 C 语言里, 命令行参数是通过 main 函数的参数传递的, 如 main(int argc, char *argv[]) ,而在 Perl 中, 命令行是传给数组 @ARGV 的, 在 @ARGV里, 并不包含程序本身的参数.
2 数据类型
2.1 标量 $var
引用方法:$var
赋值方法:$var=”hello”或32;
2.2 数组 @array
引用方法:$array[0..n]
赋值方法:@list = split /,/ $x; @keys = keys %hash; @values = values %hash;
@list =("a", "b", "c"); @list = qw/a b c d/;@b = (2,5);@c = (@a, @b);
2.3 哈希 %hash
引用方法:$hash[$key]
赋值方法:
2.4 文件句柄(FileHandles)
略,其他章节有讲述,在此不赘述。
2.5 列表
列表就是一系列的元素, 如 (1, 3, 3),
($x, $y, $z) = (1, 5, 8); # $x = 1, $y = 5, $z = 8
($x, $y) = ($x, $y); # 交换 $x 和 $y 的值
2.6 复杂的数据结构
有时候只使用简单的标量或数组, 和哈希并不能达到我们的要求,这时需要使用一些较为复杂的数据结构, 例如,二维数组——perl -操作数组的数组(二维数组)
声明和访问数组的数组创建一个数组的数组(有时也可以叫“列表的列表”,不过不太准确)真是再简单也不过了。它相当容易理解,并且本文中出现的每个例子都有可能在实际应用中出现。
数组的数组就是一个普通的数组(@AoA),不过可以接受两个下标("$AoA[3][2])。
下面先定义一个这样的数组: "
# 一个包含有“指向数组的引用”的数组
@AoA = (
[ "fred","barney" ],
[ "george","jane", "elroy" ],
[ "homer","marge", "bart" ],
);
print $AoA[2][2];
bart
你可能已经注意到,外面的括号是圆括号,这是因为我们想要给数组赋值,所以需要圆括号。如果你*不*希望这里是 @AoA,而是一个指向它的引用,那么就得这样:
# 一个指向“包含有数组引用的数组”的引用
$ref_to_AoA = [
[ "fred","barney", "pebbles", "bambam", "dino",],
[ "homer","bart", "marge", "maggie", ],
[ "george","jane", "elroy", "judy", ],
];
print $ref_to_AoA->[2][2];
注意外面的括号现在变成了方括号,并且我们的访问语法也有所改变。这时因为和 C 不同,在 Perl 中你不能自由地交换数组和引用(在 C 中,数组和指针在很多地方可以互相代替使用)。$ref_to_AoA 是一个数组引用,而 @AoA 是一个数组。同样地,$AoA[2] 也不是一个数组,而是一个数组引用。所以下面这两行:
$AoA[2][2]
$ref_to_AoA->[2][2]
也可以用这两行来代替:
$AoA[2]->[2]
$ref_to_AoA->[2]->[2]
这是因为这里有两个相邻的括号(不管是方括号还是花括号),所以你可以随意地省略箭头符号。但是如果 $ref_to_AoA 后面的那个箭头不能省略,因为省略了就没法知道 $ref_to_AoA 到底是引用还是数组了 ^_^。
3 运算符
3.1 赋值(Assignment)运算符 =
3.2 算术(Arithmetic)运算符 + - * / % **乘方 ++ --
特别说明:.(字符串连接符)
$z=$x.$y; 将$x字符串和$y字符串连接之后,再将结果指派给$z
连接操作符(.) : $x = "hello,"; $y = "world.", $z = $x .$y; 这时 $z ="hello, world."
重复操作(x) : $x = "he" x5; 这时 $x ="hehehehehe"
3.3 数值(Numeric Values)关系运算符:> >= < <= == !=
特别说明:<=>
$x<=>$y 如果$x大于$y,返回1的值,如果$x等于$y,否则返回0;&127;如果 $x小于$y,则返回-1的值
3.4 字符串(String Values)关系运算符
gt ge lt le l eq ne
cmp 如果$str1大于$str2,返回1的值,如果$str1等于$str2,返回0,如果$str1小于$str2,则返回-1的值
3.5 逻辑(Logical)运算
1$x&&$y(And)
2 $x||$y(Or)
3 !$x(Not)
3.6 其它常用的运算符
.. 区块运算符(Range Operator)
说明:这个运算符是Perl语言中特有的运算符,是一个很实用的运算符.
范例:
@digits=(1..9);#此时@digits=(1,2,3,4,5,6,7,8,9);
@digits=('01'..'05');#此时@digits=(01,02,03,04,05);
@char=('A'..'E');#此时@char('A','B','C','D','E',);
@total=(1..3,'A'..'B');#此时@total=(1,2,3'A','B');
判别运算式?运算1:运算式2 条件运算符(Conditional Operator)
说明: 这个语法的意义和C语言一样,如果判别运算式的值是真(True)的话,则做运算 ,1的运算,如果判别运算式是假(False)的话,则做运算式2的运算.
范例:
$price=($age>60)? 100:200;
如果$age大于60的话,则$price等于100,否则$price等于200.
3.7 常用的文件数据(File test)运算符
-r $file 如果$file是可读取的话,返回1的值
-w $file 如果$file是可写入的话,返回1的值
-x $file 如果$file是可执行的话,返回1的值
-e $file 如果$file存在的话,返回1的值
-o $file 如果$file是被执行才所拥有的话,返回1的值
-s $file 返回$file的文件大小(bytes)
-f $file 如果$file是正常文件的话,返回1的值
-T $file 如果$file是文本文件的话,返回1的值
-B $file 如果$file是Binary文件的话,返回1的值
-M $file 返回$file文件最后一次更改时间到现在的日期数
4 正则表达式(匹配与替换)
4.1 匹配
/xxx/ or m/xxx/ or m|xxx| or m{xxx};
m 操作符用于匹配, 上面的四种写法是一样的.用 // 时, m 可以省略, 即 /aa/ 与 m/aa/ 是一样的.
$file = qq/tmpfile/;
open(FH, $file) or die $!;
while(<FH>) {
if(/abc/) {
}
}
4.2 替换
s/a/b/ or s|a|b| or s {a} {b}
s xaxbx
s|/+|/|g
s 操作符用于替换, 上面的四种写法是一样的.
e.1
$str = "abcdef";
$str =~ s/bcd/xxx/g;
i 忽略大小写, 如 /abc/i 能匹配 ABC, 或 ABc 或 aBc
g 匹配全部, 而不只是第一个
x 忽略空白, 如下面的:
4.3 正则表达式
基本符号定义:
. 匹配一个字符
.* 匹配任意多的字符, 贪婪式
.*? 同上, 非贪婪的
? 零个或一个
+ 一个或多个
[a-z] 中括号指定一个范围
[0-9] 相当于 \d
\w 相当于[a-zA-Z0-9_]
\d [0-9]
\D 非数字
\W 与 \w 相反
\s 空格, 当然了, 直接打空格也可以的, 但有时需要如 \s+
\t Tab
\n 换行
\r 回车
{} 大括号指定数量
a{m,n} 匹配 m 至 n 个 a
a{m,} 匹配 m 个以上(包括 m) 的 a
a{m} 匹配 m 个 a
^ 匹配开头
$ 匹配结尾
应用例子:
a+ 能匹配一个 a 或多个 a , 如 aaa, aaaa
[a-f] 匹配 a 至 f 的任意一个字符, 注意: 只是匹配一个字符
[a-f]+ 匹配 a 至 f 的一个或多个字符, 如 af, abc,ccedf
a? 匹配 0 个或 1 个 a
[\s\t]+ 匹配一个空白, 即匹配一个或多个这样的组合 [\s\t]
^aaa 匹配以 aaa 开头
aaa$ 匹配以 aaa 结
4.4 匹配任何字符:/s
默认情况下,点(.)不匹配换行符,这对于“单行中查找”的问题能很好解决。如果你的字符串中有换行符,并希望点(.)能匹配它们,那可以使用/s 这个修饰符。它将模式中点(.)的行为变成同字符类[\d\D]的行为类似:可以匹配任何字符,包括换行符。从下例中可见其区别:
◆如果你想改变其中的一部分,但不是全部,那可以将此部分用[\d\D]代替
$_ = “I saw Barney\ndown at the bowingalley\nwith Fred\nlast night.\n”;
if(/Barney.*Fred/s){
print “That string mentions Fred afterBarney!\n”;
}
如果不使用/s,那么上述模式将不能被匹配上,因为这两个字符不在同一行中。
4.5 内存值的保存
这 些匹配变量的值会保持不变,直到下一个模式成功匹配为止◆。也就是说,一个没有匹配成功的模式将不会改变内存中相应的值,但一个匹配上的模式将重写此内 存。这明确的告诉你,不要随意的使用这些变量,除非明确知道它们匹配正确;否则,你可能得到上个模式匹配的结果。下面的例子(不好的例子)本意是输出被$wilma 变量匹配的字符串。但如果匹配失败,它将输出$1 中以前所匹配上的字符串。
◆这里的作用域规则相当复杂(可查看相关文档),除非你希望这些匹配变量在数行后还被使用,否则不会有什么问题。
$wilma =~ /(\w+)/; #不好,没有检测匹配的结果
print “Wilma’s word was $1… or was it?\n”;
这也是为什么模式匹配几乎都在if和while 循环的条件判断出现的原因:
if ($wilma =~ /(\w+)/){
print “Wilma’s word was $1.\n”;
} else {
print “Wilma doesn’t have a word.\n”;
}
由于内存中的值不会一直保留,那应当在模式匹配后尽快地(几行内)使用像$1 这样的变量。如果维护人员在正则表达式和使用$1 的表达式之间加入了新的正则表达式,那此时$1 的值为第二个匹配的结果,而非第一个。由于这个理由,如果要在后面使用这个变量的值,应当将其拷贝到普通变量之中。这样做同时也可以使程序更易于阅读:
if($wilma =~ /(\w+)/){
my $wilma_word = $1;
…
}
另外,可《Perl 语言入门》(第四版)在第九章,你将学习到如何在模式匹配时直接将内存中的值存入变量之中,而不需要明确的使用$1。
5 文件和目录操作
5.1 文件操作
open, < > >> , close 文件句柄FH <FH>
open $_,">file.$_" or die $!;
if(!open LOG, “>>logfile”){
die “Cannot create logfile:$!”;
}
e.1
$file = tmpfile;
open(FH, $file) or die $!;
while($line = <FH>) {
print $line;
}
e.2
$file = tmpfie;
open(FH, $file) or die $!;
@file = <FH>;
foreach(@file) { print }
e.3
$file = tmpfile;
open(FH, $file) or die $!;
%hash = map(chomp;$_=>1} <FH>;
for $key(keys %hash) {
print $key, "\n";
}
5.2 目录操作
3.2 目录处理
=============
3.2.1 读取目录中的文件
opendir,readdir, closedir
$dir = q/./;
opendir DIR, $dir or die $!;
@files = grep { !/^\./ } readdir DIR;
这样得到了所有不是以点(.)开头的文件名(包括目录).
e.1
opendir(DIR, ".") or die $!;
while($file = readdir(DIR)) {
next if $file =~ /abc/;
print $file, "\n";
}
closedir(DIR);
e.2
my @log_files =glob"/logs/_ocelogs/_fephw/fep_hw_send_${process_id}_${file_date}_*";
my (@array,$line,%rtncode,$te);
foreach(@log_files)
{
if($_=~/.*\.gz/){
open (LOGS_HANDLE ,"zgrep send $_ |");
}
else{
open (LOGS_HANDLE ,"$_");
}
3.2.2 grep 使用
----------------
grep 对一列表做处理, 返回符合条件的元素.
下面的语句只返回文件名(不包括目录):
@files = grep { !/^\./ and -f qq|$dir/$_| }readdir DIR;
3.2.3 递归读取目录
-------------------
sub r {
my $dir = shift;
local *DIR; # 定义成局部变量
opendir DIR, $dir or die $!;
readdir DIR;
readdir DIR;
while($file = readdir DIR) {
$path = qq.$dir/$file.;
if(-d $path) { # 如果是目录, 则递归处理
r($path);
} else {
print $path, "\n";
}
}
closedir DIR;
}
3.2.3.1 使用 File::Find 递归目录
---------------------------------
File::Find 遍历给定的目录, 对每个文件调用指定的文件处理.
sub p {
print $File::Find::name, "\n";
}
use File::Find;
find(\&p, $dir);
File::Find 中指定函数中的变量:
$File::Find::name 相对于给定路径的文件名路径
$_ 当前环境下的文件名
下面的函数打开所有文件, 读取后输出:
sub p {
local *FH;
return unless -f; # 只对文件操作
open FH, $_ or die $1;
print while <FH>;
close FH;
}
find(\&p, $dir);
其它的信息请见 manFile::Find
创建目录
mkdir("aka",0777) or die "不能创建 aka 目录";
0777 为文件权限描速数。
删除目录:
rmdir("aka") die "不能删除 aka 目录"。
5.3 得到文件的最后修改时间
----------------------------
$hour = -M$file;
print t2str(time- $hour * 3600);
当然, 我们也可以直接用 stat 得到文件的最后修改时间的秒数:
($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,
$atime,$mtime,$ctime,$blksize,$blocks)
=stat($filename);
当中的 $mtime 即秒数, 其它详细信息请见perldoc -f stat
5.4 读压缩文件
有时, 需要打开压缩文件处理, 可以使用外部程序如zcat, gzip 等:
open FH,"zcat $file | " or die $!;
print while<FH>;
6 常用内置函数
6.1 常用函数列表
下面将介绍一些 Perl 自身提供的一些标准系统函数,这些函数包括: print 、printf 、sprintf 、chop 、chomp 、split 、keys 、values 、reverse 、sort 、length 、substr 、index 、push 、pop 、unshift 、shift 、join 、grep 、hex 、rand 、localtime 、die 、open 、close 、pack 、read 、map 、uc、rename 、unlink、 lc exit。下面就来分别介绍他们。
6.2 print
指令:print
语法:printFilehandle LIST
在为大家介绍PRINT这个函数之前,先让我们来看看PRINT函数中特殊打印字符:
符号 其作用
\n 换行 new line
\r 光标换行 return
\t tab键
\f 换页 form feed
\b 退回一格
\v 垂直tab键
\a 响铃Bell
\e escape键
\007 十进制ASC II码
\xff 十六进制码
\c[ 控制字符
示例: printSTDOUT "网上学园\n"; 将"网上学园"加上换行显示在屏幕上.
6.3 printf
指令: printf
语法: printfFilehandle LIST
说明: 在perl语言中也提代C语言中printf的语法,用法和C语言中的用法一模一样.如果把Filehandle省略的话 ,也一样会把STDOUT当成是内定的Filehandle.在为大家介绍printf函数之前,先让我们来看看printf函数中变换符号的字符.
符号 其作用
%c 字符
%s 字符串
%d 整数
%f 浮整数
%h 十六进制码
%o 八进制码
示例:printf("chomod%d%s\n","711""CGI");会将chmod 711cgi加上换行显示于屏幕上。
6.4 keys
指令:keys
语法:keys(%array)
说明:取出关联数组%ARRAY中全部的key。
示例:%NAME=(1,"mike",2,"michael");@readkey=keys(%NAMES); #这时@readkey=(1,2);
6.5 values
指令:values
语法:values(%array)
说明:取出关联数组%ARRAY中全部的value。
示例:%NAMES=(1,"mike",2,"michael");@readval=values(%NAMES); #这时@readval=("mike","michael");
6.6 reverse
指令:reverse
语法:reverse(@array)
说明:将数组@array中的元素由后到前重新排列。
示例:@back=("A","B","C","D","E");@back=reverse(@back); #这时@back=("E","D","C","B","A");
6.7 sort
指令:sort
语法:sort(@array)
说明:将数组中的元素由小到大排序,如果要由大到小排序的话,要加上reverse这个函数。
示例:
@abc=("d","b","c","a");@abc=sort(@abc); #这时@abc=("a","b","c","d");
@abc=(reverse sort@abc); #这时@abc=("d","c","b","a");这个语法也可以写成@abc=(reversesort(@abc));
@number=(5,2,10); @number=sort(@number); 上面示例用sort函数来排序数值的时,会出差错,因此要用下面到下面这一句。@number=(sort{$a<=>$b}@number); #这时@number=(2,5,10);
sort 默认是按字符大小从小到大排序的, 想改的话可以使用<=> 和 cmp 比较运算符:
<=> 数值比较, cmp 字符串比较
@x = (1, 5, 4); @y = sort {$a <=> $b}@x; # @y = (1, 4, 5);
@x = qw/bb aa cc/; @y = sort {$b cmp $a} @x;# @y = qw/cc bb aa/;
6.8 split
指令:split
语法:split(/pattern/,$text,limit)其中/pattern/是文字处理的模式,而limit是代表要分割的个数,一般可以省略。
说明:用一个指定的文字处理模式来分割$text字符串。
示例:
$text="Michael,Gevin,Mike";@name=split(/,/,$text); #这时@name=("Michael","Gevin","Mike");
($a,$b,$c)=split(/,/,$text); #这时$a="Michael";$b="Gevin";$c="Mike";
@name=split(/,/,$string,2); #这时@name=("Michael","Gevin");
6.9 join
指令:join
语法:join($string,@array)
说明:在一数组@array的元素之间加上一指定的字符$string,并将结果返回。
示例:
@array=("one","two","three");
$total=join(":",@array); 这时$total="one:two:three";
6.10 push
指令:push
语法:push(@array,$string)
说明:在数组@array的最后附加新的元素 ($string)到数组@array中。
示例:@array=("one","two");push(@array,"three"); #这时$@array=("one","two","three")
6.11 pop
指令:pop
语法:pop(@array)
说明:将数组(@array)的最后一个元素删除,并将删除的元素返回。
示例:@array=("one","two");$rm=pop(@array); #这时@array=("one");而$rm="two";
6.12 unshift
指令:unshift
语法:unshift(@array,$string)说明:在数组@array的第一个元素前附加新的元素$string到数组@array中。 示例: @array=("one","two");unshift(@array,"three"); #这时@array=("three","one","two")
6.13 shift
指令:shift
语法:shift(@array)
说明:将数组@array的第一个元素删除,并将删除的元素返回。
示例:@array=("one","two");@rm=shift(@array); #这时@array=("two");而$rm="one";
6.14 grep
指令:grep
语法:grep(/pattern/,@array)
说明:将合文字处理模式(regular expression)的数组元素找出来。
示例:
@array=("one","on","in");
$count=grep(/on/,@array);# 这时 $count=2
@result=grep(/on/,@array);# 这时@result=("one","on");
6.15 rand
指令:rand
语法:rand($interger)
说明:常和函数srand搭配来取得一随机数,如果没有先宣告stand函数的话,则取出的常数值是一个固定值。这个语法会返回一个介于 0 和$interger之间的数值,如果$interger省略的话,则会返回一个介于 0 和 1 的数值。
示例:
srand; # 要先调用一次srand函数,才能产生随机数的效果
$int=rand(10); #$int的值会大于 0 而且小于 10 ,如果希望产生的乱数是整数的话,就要再加上int 这个函数,如下
$int=int(rand(10));# $int的值是一个整数,且值在 0 和 9 之间
6.16 localtime
指令:localtime
语法:localtime(time)
说明:可返回九个有关时间的元素,在写CGI应用程序的时候常会用到系统的时间,所以在此会详细介绍这个函数的用法。
示例:
($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst)=localtime(time);
其中: $sec 代表秒数 [0,59]、$min 代表分数 [0,59]、$hour 代表小时数 [0,23]、$mday 代表是在这个月的第几天 [1,31]、$mon 代表月数 [0,11] 因此要将 $mon 加 1 之后,才能符合实际情况、$year 从 1990 年算起的年数、$wday 从星期六算起,代表是在这周中的第几天 [0-6]、$yday 从一月一日算起,代表是在这年中的第几天 [0,366]、$isdst 只是一个 flag 知道这些变量之后,就可以在 CGI 应用程序中拿来应用了。
也可以用系统指令来取得系统时间$date='/usr/bin/date';
6.17 die
指令:die
语法:die LIST
说明:会把LIST字符串显示出来,并退出程序。常常和 $! 这个代表错误信息变量一起使用。
示例:
open(FILE,"$filename")die"不能打开文件$!\n; # 如果打开文件失败的话,就会显示出错误的信息,之后再退出程序。
语法5:open(filehandle,"unixcommand")
说明:就会把在filehandle的数据输入给unix的指令来作处理。
示例:
$mailprog="/usr/UCb/mail";# unix系统上的寄信程序(一定要加绝对路径)
$who="mqingyi@126.com";
$open(file,"$mailprog$who")die"打开失败\n";
? print file "I love you!\n";
print file"I want to see you.\n";
close(file);
该段代码通过 unix 系统的 mail 程序,将 FILE 这个 FILEHANDLE 的数据内容寄给 $who 这个变量所指定的收信人。
6.18 exit
指令:exit
语法:exit
说明:退出执行的程序。
示例:
print"ilove cgi\n"; exit; # 表示显示完 "i love cgi" 以后,将退出这个程序。
6.19 system
当你向系统 Shell 发送一个命令行时,Shell 创建一个进程来执行这个命令。这个新进程成为 Shell 的子进程,它的执行不依赖于 Shell 但又与 Shell 相互协调。 同样,Perl程序也能启动新进程。
使用system()和exec()-----生成新进程的最简单的方法就是用 system 操作符。如:
system("date");
若要将输出送至now_day文件,则可以:
system("date>now_day") die"不能建立now_day文件";
使用单引号
产生进程的另一方法是将 Shell 命令置于两个单引号之间。如:
$nowday="现在时间:".'date'
$nowday 的值为“现在时间:”和date命令的结果的连接。即:"现在时间:Fri Feb 18 23:49:23 PDT1998"
6.20 read
指令:read
语法:read(filehandle,$string,length) 其中 length 是代表读入字符串的长度(bytes)。
说明:用 read 这个函数把filehandle 中的数据依指定的字符串长度读入之后指派给 $string 这个变量。在cgi程序分割解码过程中,如果FORM 的传送方式是设定为POST的话,就会将传送的数据设定为标准输入,所以会将数据内容指定给 STDIN这个标准输入的filehandle ,而CGI环境变量 $env{'content_length'} 就是代表使用者送出数据内容的长度,因此我们要用 read 这个函数来取得使用者送出的数据内容。
示例:
read(stdin,$buffer,$env{'content_length'});# 就会将 stdin 这个标准输入 filehandle 中的数据依指定的字符串长度读入,再指派给 $buffer 这个变量。
6.21 hex
指令:hex
语法:hex($string)
说明:将十六进制的数值转成十进制。
示例:
$decimal=hex("ff");这时$decimal=255;
6.22 exists 函数
要查看hash 中是否存在某个key(某人是否有借书卡),可以使用exists 函数,如果hash 中存在此key,则返回true,这和是否有对应的value 无关:
if(exists$books{$dino}){
print “Hey,there’s a libaray card for dino!\n”;
}
这即是说,当且仅当hash 中(keys % books)的keys 的列表中存在dino 时,exists $books{“dino”}才返回true。
6.23 delete 函数
delete 函数将某个给定的key(包括其对应的value)从hash 中删除。(如果不存在这个key,则什么也不做;不会有警告或者错误信息。)
my $person =“betty”;
delete$books{$person}; #将$person 的借书卡删除掉
这和hash 中存储的为undef 是不同的。使用exists($books{“betty”})将给出相反的结果。使用delete后,hash 中将不会存在此key;如果其值是udnef,则key 是存在的。
本例中,delete 和存储的值为undef 的不同点在于,前者是将Betty的借书卡取走(删除),而后者是给她一张从没有用过的借书卡。
6.24 其他
unlink 删除一个文件: unlink($file);
rename 重命名一个文件: rename($old, $new);
link 对文件作硬链接: link($old, $new);
symlink 对文件作软链接: symlink($old, $new);
readlink 读取软链接的文件名: $l = readlink($file); # 很少使用
rmdir 删除一个空目录: rmdir($dir);
$s=substr("perl5",2,2); #这时$s="rl";
$s=substr("perl5",2); #这时$s="rl5";
$s=substr("perl5",-2,2); #这时$s="er";
$s=index("perl5","p");#这时$s=0
$s=index("perl5","l",2);#这时$s=3
$s=index("perl5","perl");#这时$s=-1
chop 去掉最后一个字符: $x = hello; chop $x; # $x= hell
chomp 去掉最后的换行如果有的话
split 按一定规则分割:
$x = "ab cd ef";
@t = split / /, $x; # @t = ("ab", "cd","ef")
join 把数组用给定字符串连起来:
@t = ("ab", "cd","ef");
$x = join "-", @t; # $x = "ab-cd-ef"
@array=("one","two","three");
$total=join(":",@array); 这时 $total="one:two:three";
@list = sort {$a <=> $b } @t;
shift 是 Perl 的内置函数, 表示从数组中获取第一个元素,
并且把此元素从数组中删除, 如 $t = shift@list;
假设 @list = (b, a, c); 那么这时 $t = b; @list = (a, c)
如果没有给 shift 参数的话, 默认是对数组 @ARGV 操作,
如果是在子函数中的话, 默认是对数组 @_ 操作.
所以在上面的例子中, 如果 $file =shift; 那么 $file =arg1
而这时 @ARGV = (arg2) 了. 看下面的代码:
$file = shift;
$num = shift || 100;
如果我们运行: perl t.pl tmpfile 50 , 那么这时
$file = tmpfile, $num = 50;
(素材来自网络)
以上是关于Perl学习总结的主要内容,如果未能解决你的问题,请参考以下文章