参考
《Perl实例精解 Perl by Example》
应用、工具
编辑工具:NotePad, Ultra-Edit, PerlEditor, PerlIDE
Perl运行:../Perl/bin/perl.exe -w "%f"
Perl编译:../Perl/bin/perl.exe -w -c "%f"
Perl调试:../Perl/bin/perl.exe -w -d "%f"
变量和常用函数
-
字符串表示
-
$a="hello"; 字符串用单引号'hello',双引号"hello",qq(hello),q(hello)都可以.
-
" " --- 变量替换,转义,用前置/表示特殊字符$ ' " /. print "$string/n" 如果变量$str和$string都有,将按最长匹配,即匹配$string.
-
' ' --- 变量不替换,不转义,前置/只用于' /
-
q --- 代替单引号
-
qq --- 代替双引号,
-
如print q($a/n) 输出"$a/n" ,如果换成qq, 将输出$a的值后换行
-
q/qq后面的()可以用{},[],<> // ;; !!替换。括号内的特殊字符不需要用"/"转义。
-
转义字符:/n换行,/r回车(从行尾跳到行首), /a 响铃, /b 退格, /e ESC, /t 横向跳格TAB, /v纵向跳格, /cn CTRL+n, /f 换页
-
/l下一个字符是小写,/u 下一个字符是大写, /L后面都是小写,直到/E, /U后面都是大写,直到/E, /Q不查找模式匹配字符,直到/E
-
/nnn八进制表示的ASCII码,/xnn十六进制表示的ASCII码
-
-
字符串函数
-
length($s), lc/uc 转成全小写/大写, ucfirst,lcfirst, pos
-
index, rindex
-
index查找某子串位置,从0开始计数。rindex是从右边开始查找
-
position = index (string, substring, position)返回子串substring在字符串string中的位置,如果不存在则返回-1。参数position是可选项,表示匹配之前跳过的字符数,或者说从该位置开始匹配。
-
-
substr
-
substr (expr, skipchars, length)
抽取字符串(或表达式生成的字符串)expr中的子串,跳过skipchars个字符,或者说从位置skipchars开始抽取子串(第一个字符位置为0),子串长度为length,此参数可忽略,意味着取剩下的全部字符。
当此函数出现在等式左边时,expr必须为变量或数组元素,此时其中部分子串被等式右边的值替换。substr() 函数的作用有两个:替换一部分子串。 删除一部分子串。
-
$string = "This is what you have";
$first = substr($string, 0, 1); # "T"
$start = substr($string, 5, 2); # "is"
$rest = substr($string, 13); # "you have"
$last = substr($string, -1); # "e"
$end = substr($string, -4); # "have"
$piece = substr($string, -8, 3); # "you"
-
-
$a.$b ----字符串连接
-
'a' x 5 --- 'aaaaa', x表示重复,前后必须有空格,如果重复次数小于1,得到空串
-
chop(str) ---str变量直接截去最后一个字符。注意是这个变量直接变了,而不是变了或赋给另一个变量
-
chomp(str) ---str变量直接截去末尾的行分隔符,默认分隔符是/n,可以用 $/定义。如果$/="",chomp将截去所有换行符
-
ubstr($string, $offset, $count);
-
-
数值表示
-
运算符:$a**$b ---- a^b,其他运算符 +, -, *, /, %(取余), ++, --, -$a, 字符串参加运算会自动转换
-
函数:$a = Int(5.5) ---- 5 Int取整,rand(5) 0-5的随机数, srand, sin, sqrt,
-
5_555_555 --------下划线不会编译,只是为了方便阅读
-
.3=0.3, 3.=3.0
-
八进制:以0开头,027=23
-
十六进制:以0x开头,0x27=39
-
整数最长15位,指数范围-309 ~ 308
-
$a=<>; <>表示从键盘输入
-
输出
print "$a/n"; #打印用print
$_ = "Hello";print ; #输出时如果没有指定输出值,就输出$_变量值
-
转换函数:ord, chr, pack, unpack
-
变量没有创建 undef($a)
-
将一个变量声明为未定义
-
用在条件判断中
-
代替不关心的变量
-
到达文件尾
-
可以用#! /user/bin/perl -w 提示undef变量
-
$s="a:b:c:d";($a1,undef,undef,$d1)=split(/:/,$s);-
变量已经创建defined,用在条件判断中: if(defined($a))
-
数值变量初值为0,字符串变量初值为空串
运算符
-
位运算符:&, |, ~, ^, <<, >>
-
赋值运算符:=, +=, -=, *=, /=, %=, **=, &=, |=, ^=, .= 可以连等$a=$b=3;
-
自增++, 自减--,字符串可以自增,不可以自减, $a="az"; $a++; $a变成"ba"
-
","逗号运算符,两个语句关联紧密时可以用逗号连接,将语句写在一行
-
条件表达式: 条件?真:假,$result=$var==0?14:7===>条件为真,$result赋值14,为假,赋值7; &a==43?$var1:$var2=14; ===>条件为真, $var1=14, 条件为假,$var2=14
-
数值比较: <, >, ==, <=, >=, !=, <=>. $a<=>$b ---a>、=、<b,分别返回1、0、-1
-
字符比较:lt, gt, eq, le, qe, ne, cmp。比较顺序按照ASCII码顺序,数字<大写<小写,从左往右比较,空串"",空列表, 0,undef定义为假
-
逻辑比较:&& (and), || (or), ! (not), xor
-
运算符优先级: ++ --最高,单运算符高于多运算符,数字》比较》位》赋值》逻辑. 其中数字幂》* /》+-. 比较运算符> <高于==, !=
控制结构
-
Perl没有Switch语句
-
Exit 0; 退出Perl
-
条件
-
if(执行条件) {} elsif() {} else {} ; 注意elsif 没有"e",{}必须有,但可以为空。elsif和else都可以没有
-
unless(退出条件){}
-
-
循环:
-
while($i<10){last if($i==5);$i++;}
-
do {} while(执行条件) 至少执行一次
-
until(执行条件){}
-
do{} until(退出条件)
-
for($i=2;$i<10;$i++){}。last退出当前循环
-
foreach $c(@a) {}
-
foreach $c(@a[1,2]) {} 访问部分元素
-
foreach (@a) {print "$_"} $_循环变量的缺省值
-
foreach ($i=2;$i<10;$i++){} 与For通用
-
- 循环控制
- last 退出循环
- next 进到下一次循环
- redo 重新执行本次循环,在do语句中失效
- goto 不能跳转到循环或子程序内
- label:标记,last/next/redo/goto后都可以使用,一般用大写加:
- 循环语句后可以用continue{}:last跳出后continue不执行,next会执行
OUTER: while()
{
INTER: while()
{
last OUTER; #中止外层循环
}
}
-
单行语句:语句+条件
-
print $a if $a==0; 条件if、unless、while($a--==0)、until($a--==0)
-
$a==0 && print $a;
-
open(F,"file") || die "can't open file"; die 报错后退出程序, warn报错后不退出程序,$!内部变量 包含错误代码,$@内部变量 包含错误信息
-
列表和数组
-
列表:
-
(1,"Hello",3.5),列表元素可以用空格或逗号隔开,可以是单元素列表,列表也可以是空的
-
qw(a b c d), qw(a,b,c,d)=('a','b','c','d') qw是字符串列表,里面元素不需要用引号, 和qq类似
-
(1..5, 11..15) ..表示范围运算符。
-
元素从左边开始增1,直到小于右边值,(2.4..5.3) ==>(2.4,3.4,4.4)。
-
如果右边小于左边(4.5..1.6),则为空。
-
("aa".."ad") ==>("aa","ab","ac","ad")
-
($a..$a+3)
-
@month=("01".."31")
-
-
$a=(1,2) ==>$a取列表最右边值,即2
-
-
数组
-
创建数组:
-
@array=qw(a, b, c, d);
-
($a,$b,$c)=qw(a,b,c);
-
@b=(1,@a,4);
-
@c=('a') x 4; (4个元素都是'a')
-
@a=<>; 从键盘输入,ctrl+d结束
-
@a=(1,2,3,4); $a[5]=6; 数组自动变成6个元素,中间空的元素为NULL
-
-
取出元素:
-
$array[index] 单个元素,index从0开始
-
@array[index1,index2,...] 取部分元素
-
$#array 最后一个元素的index,$array[$#array] 最后一个元素
-
$array[-1] 最后一个元素,-1表示从后开始取第1个。
-
$array[0]表示元素,而"$a/[0]","$a{a}[0]","$/{a}[0]"表示字符串
-
-
遍历数组
-
for($index=0; $index<@array; $index++)
-
foreach $number(@array)
-
print @found; 元素相连输出
-
print "@found"; 元素之间用空格连接输出
-
-
元素交换:@a[1,2]=@a[2,1]
-
-
数组函数
-
sort 排序
-
sort {代码块}或函数名 (@array)
-
缺省代码块,表示按字母顺序排序
-
用$a,$b代表数组元素,@_代表数组
-
@a=(1,12,4,8,20)
-
sort(@a) ---字母顺序排序 1,12,20,4,8
-
sort {$a<=>$b} (@a); ----数字顺序排序,1,4,8,12,20
-
-
reverse @array 将数组倒序,即最后一个元素变成第一个
-
chop @array 每个元素截去最后一个字符
-
chomp @array 每个元素截去末尾行分隔符
-
shift(@array); 删除数组第一个元素,返回删除的元素。缺省对@ARGV数组
-
unshift(@a,$b); 在数组开头增加元素,返回新数组长度
-
push(@a,$a); 在数组末尾增加元素
-
pop(@a); 在数组末尾删除元素
-
Join 把数组元素连接成一个字符串
-
Join('连接字符',@a)
-
Join('连接字符','a','b')
-
print join(" ", sort(@array)); join 将数组元素用" "分隔,然后输出
-
-
Split分割字符串
-
@a=split(/模式/,分割字符串,长度)
-
模式:缺省为空格,可以省略
-
分割串:缺省为$_,可省略
-
长度:可省略,表示全部分割。
-
$s="a-b-c"; @a=split(/-/,$s,2); ==>@a=('a','b-c')
-
-
wantarray(),判断是要返回数组还是简单变量
-
sub mysub(){ print wantarray()?"数组/n":"变量/n";}
-
@a=mysub();
-
$b=mysub();
-
-
splice 数组部分元素替换
-
@ret=splice(@a,skip,length,@newlist)
-
对@a操作,跳过skip个元素,然后开始用@newlist替换length个元素
-
@newlist和length可以不等长,无论@newlist多长,它替换length长的元素位置
-
当length=0时为插入。splice(@a,-1,0,@n)在末尾追加
-
当@newlist为空时则为删除
-
当length和@newlist省略时为其后的全部删除,如splice(@a,3) 保留前3个元素
-
-
grep 搜索字符
-
@found=grep(/pattern/,@search)
-
对@search的每一个元素搜索匹配模式,匹配的元素返回到@found数组中
-
-
map 对每个元素($_)进行运算, 返回运算后的数组
-
map(expr,@list)
-
map($_+1,(1,2)); ==>(2,3)
-
-
-
二维数组 $aoa=[[1,2,3],['a','b','c']]; 引用地址
-
@{$aoa->[0]} 子数组访问
-
@($aoa->[0]} [0,1] 子数组元素列表
-
$aoa->[0][0] 元素访问
-
$aoa=[[@a],[@b]]; 两个数组组成一个二维数组,里面的[]不能省略
-
-
关联数组,Hash,哈希,散列
-
概念:元素内容与位置有关,元素下标变成任意简单变量,实现通过简单变量访问元素值
-
原理:分散存储,通过一个函数(散列函数)把位置值简单变量转换成分散的另外的值,按该值存储
-
特点:1)有的位置可能无值,用空间换取时间; 2)数组内容没有顺序;3)对查找单个值,比数组慢,但比链表快
-
$wordcount{$word}++; 对英文中每个单词计数
-
关联数组可以模拟数据结构:链表,结构,树,二维表
-
Hash表示
-
%h=('a',1,'b',2); %h=('a'=>1,'b'=>2); key和value成对出现
-
%开头,()为空散列,'a''b'称为关键字key,由key得到的为值Value,Key的引号省略时自动认为是字符串
-
元素形式:$hash{'a'}; $h{2.5}, $h{-1}, $h{$k}
-
-
Hash赋值
-
%h= @a 如果数组@a是成对的
-
@a=%h 数组元素的顺序是随机的
-
%h1=%h2
-
($a,%h)=@array
-
%h=(%first,%second); 浪费内存
-
%h1=(%h2,'k','v') 增加一组键值
-
%h=split(); 函数返回作为散列
-
获取散列片断:@keys=('a','b','c'); @hash{@keys}=@hash{reverse(@keys)};
-
$hash{@keys} ==>$hash{3}
-
%h=(a=>1,b=>3); print "%h/n"; ==>%h
-
print %h; ==> a1b3
-
$a=%h; print "/n$a/n"; ==> 2/8 产生8对,已经赋值的2对
-
-
散列操作函数
-
keys(%h) 返回键列表的数组;
-
values(%h)返回值列表的数组
-
($key,$value)=each(%hash) 取出键值对,最后返回undef
-
exists $h{'key'} 是否存在对应值
-
Undef(%h) 删除散列,相当于%h=();
-
delete $h($k)
-
foreach $word(keys(%list)){last if ($word == "second");}
-
Tie::IxHash模块
-
%hash=reverse %h; 键值互换
-
-
模式匹配-正则表达式regular expression
-
3种形式:
-
匹配 m/<regexp>/, m/perl$/表示判断字符串末尾是否为perl
-
替换 s/<pattern>/<replacement>/
-
转化 tr/<pattern>/<replacement>/ 如大小转小写
-
if($cmd=~ m/xxx/) #如果$cmd中含有xxx,用excutecount代替. =~ 匹配;!~不匹配{
$cmd=~ s/xxx/$excutecount/g; #注意:替换后变量$cmd就变了
print "$atcmd/n";
}- 字符匹配
- + 一个或多个相同的前导字符,/d[eE]+f/ 匹配 deE, dee, dEE, dEe,deee, 匹配多个e或E,相当于/d[eE][eE][eE]/
- * 匹配0个、1个或多个相同字符
- ? 匹配0个或1个前一字符
- . 匹配除换行以外的所有单个字符(当模式选项不用s时)
- .* 匹配所有任意数量字符,相当于.....
- {} 匹配指定数目的字符,如/de{1,3}f/ 1-3个e, /de{3}f/, /de{3,}f/ 大于等于3个e, /de{0,3}f/
- 贪婪规则:尽量匹配尽可能多的相同字符
- $_ = "axxxcxxxcxxxd";
- /a.*c.*d/ .*会和第二个c之前的所有字符符合 * + ?都是贪婪的
- /a.*?c.*d/ 重复符合后加上? 可以让它变得不贪心, 和最少的a,c之间字符匹配
- 懒惰规则: 模式匹配只要找到一个就停止,不再继续匹配
- 选择匹配
- [abc] 匹配abc其中之一
- [^dEf] 匹配dEf之外的字符,主要^在[]之间
- [0-9][a-z][A-Z], [0-9a-zA-Z] 匹配任意字母或数字, /d也表示数字
- |匹配两个或多个模式之一,/def|ghi/ 匹配def或者ghi, /x|y+/ 匹配x或y+
- 例:检验数字合法性 $number =~ /^-?/d+$|^-?0[xX][/da-fA-F]+$/ 十进制或十六进制0x, -?有-或者没有,/d+$以数字结尾
- 转义符
- /*, //, /?
- /Q开始到/E间的字符为原始字符,无特殊含义
- /d 任意数字,[0-9]
- /D 除数字外的任意字符[^0-9]
- /w 任意单词字符 [0-9a-zA-Z]
- /W 任意非单词字符 [^_0-9a-zA-Z]
- /s 空白 [ /r/t/n/f]
- /S 非空白 [^ /r/t/n/f]
- 定界符,锚
- ^ /A 仅匹配字符串首
- $ /Z仅匹配字符串尾
- /b 匹配单词边界, /def/b/匹配以def结尾的字符串,//bdef/匹配以def开头的字符串
- /B 单词内部匹配,/def/B/匹配defghi等def不在右边界的字符串, //Bdef/B/ 只匹配def在中间的字符串
- 模式的重用和模式变量:
- 当模式中匹配相同的部分需要出现多次试,用()将第一次出现的括起来,随后要用时用/n代表第n个()的值。模式外要引用时用$n表示
- //d{2}([/W])/d{2}/1/d{2}/ 匹配 12-05-92, 26.22.34等,不匹配12-05.45,因为()把值记录下来,后面的/n值必须是一样的
- /(/d{2})([/W])/1/2/1/ 匹配17-17-17,不匹配12-05-34
- 模式变量
- $string="This is a number 25.11."; $string =~ /-?(/d+)/.?(/d+)/;
- $n --- 匹配后代表重用部分 $1 = 25; $2= 11
- $& --- 符合模式匹配的字符串 $& = 25.11
- $` --- 符合模式匹配的字符串之前的字符串 $`="This is a number "
- &' --- 符合模式匹配的字符串之后的字符串 $' = "."
- @result =~ /-?(/d+)/.?(/d+)/ $1,$2赋值给数组
- ($m1,$m2)=($name =~ /(ab)*(c)/)
- 如果匹配失败,$1的内容不确定,可能是从前匹配的内容。为避免失败,要进行判断或用上例10直接赋值
- 嵌套使用 /((aaa)*)/ 最外层为$1
- 当模式中匹配相同的部分需要出现多次试,用()将第一次出现的括起来,随后要用时用/n代表第n个()的值。模式外要引用时用$n表示
- 匹配选项 //后的字符:
- g 多次匹配 global
- g 匹配所有可能的模式, 返回到数组中. @matches ="balata" =~ /.a/g; ---> @matches = ("ba","la","ta")
- while("balata" =~ /.a/g) {$match = $&; print ($match/n";}
- 当使用了选项g时,可用函数pos来控制下次匹配的偏移:$offset = pos($string); pos($string) = $newoffset;
- i 忽略模式中的大小写
- m 将待匹配串视为多行,^匹配字符串起始或新的一行的开始,$匹配任意行的末尾
- s 将待匹配串视为单行,.可以匹配/n /a.*bc/s 将匹配字符串axxxx/nxxxbc,但/a.*bc/则不匹配该字符串
- o 循环结构中,模式仅执行一次变量替换, $var=1; $line = <STDIN>; while($var < 10) {$result = $line =~ /$var/o;$line = <STDIN>; $var++;}
- x 忽略模式中的空白,主要为了使模式看起来格式清晰
- g 多次匹配 global
- 匹配符合的优先级:() --> + * ? {}出现次数 --> ^ $ /b /B 位置 --> | 选项
- 扩展匹配模式(?<c>pattern)
- (?:pattern) 不存储括号内的匹配内容。/(?:a|b|c)(d|e)f/1/ /1表示已匹配的d或e,而不是a|b|c
- /(?option)pattern/内嵌模式选项,option有四个: i m s x 可以内嵌使用。/(?i)[a-Z]+/ = /[a-Z]+/i
- (?#注释) 模式内的注释. if($string =~ /(?i)[a-Z]{2,3}(?#match two or three alphabetic characters)/ )
- (?) 取消贪婪,*? +? ?? {x}? {x,}? {x,y}? 例"a12b38b" /a.*b/ 全部匹配,当/a(.*?)b/ 匹配a12b.
- /pattern(?=string)/ /pattern(?!string)/ 匹配后面为(不为)string的模式,且模式指针的位置仍保留在string之前
- $string = "25abc8"; $string =~ /abc(?=[0-9])/; &matched = $& --> abc,不是abc8
- $line = "block 1 first block 2 second block3 third"; $line =~ /block/d(.*?)(?=block/d|$)/g; print $1;
- $line = "begin <data1> begin <data2> begin <data3>"; while($line =~ /begin(.*?)(?=begin|$)/sg) {print $1;}
- 替换操作 s/pattern/replace/
- 替换部分可使用模式变量$n, 如s/(/d+)/[$1]/
- 替换部分不支持模式的特殊字符,如{},*,+等
- 替换操作符的选项 g i m o s x e
- e 将replace看做表达式,替换之前先计算其值
- $string = "0abc1"; $string =~ s/[a-zA-Z]+/$& x 2/e; ---> $string = "0abcabc1"
- 翻译操作 tr/string1/string2/
- string1的第一个字符替换为string2的第一个字符,依此类推
- string1比string2长时,其多余字符替换为string2的最后一个字符
- string1中同一个字符出现多次时,将使用第一个替换字符
- 翻译操作符的选项
- c 翻译所有未指定字符,$string =~ tr//d/ /c; 把所有非数字字符替换为空格
- d 删除所有指定字符,$string =~ tr//t //d; 删除tab和空格
- s 把多个相同的输出字符缩成一个, $string =~ tr/0-9/ /cs; 把数字间的其它字符替换为一个空格
- m指定模式定界符,默认为/
- 用特殊字符做模式定界符时,模式内的该字符转义功能或特殊功能不能使用
- 成对的符号必须成对的使用,如 s(aa)(bb)sg
- m!/u/jpublic/perl/prog1! 等价于///u//jpublic//perl//prog1/
- quotemeta('ab') = /a/b自动加反斜杠
- 类似程序块的匹配形式
- $line =~ s{ #replace
/# #a pound sign(/w+) #the variable name}{${$1}}xg$line =~ /^/QDuration(s):/E ?(/d+/.?/d+|/d+)/i) 匹配正小数 $line =~ s/^/QDuration(s):/E ?// 将"Duration(s) 去掉,留下数字 文件操作
-
open(HANDLE,">filename")||die $!; 成功返回非零,失败返回0
-
文件描述符(代表文件的数字)和文件句柄(文件变量):
-
句柄转化成描述符:fileno(F);
-
描述符转化成句柄:open(F,">&n");
-
文件句柄:以字母开头,由字母、数字和下划线组成,不能以$,@,%类符号开头,为避免与关键字重名,一般用大写字母
-
缺省打开的句柄STDIN,STDOUT,STDERR, 文件描述符0,1,2.不用调用open就可以直接访问
-
STDIN: 键盘输入,控制台;STDOUT: 屏幕,显示屏;STDERR:错误输出,显示屏
-
-
访问模式,open第二个参数,
-
只读: open(F,"file"); open(F,"<file")
-
只写: > 不存在则创建,存在则覆盖, +>读写
-
追加: >> 不存在则创建,存在则追加,+>>读写
-
读写: +< 不存在则失败,存在则覆盖
-
管道: | open(F,"|cat>hello"); 把F的输出作为|后的输入。open(F,"comm|"); 把comm的输出作为F的输入
-
-
文件名:
-
注意特殊的文件名(含特殊字符><等)可能使读变成写,因此要注意过滤
-
open(F,">&STDOUT); 写入F文件的内容都变成写入屏幕
-
open(F,">&3); open(F,">&=3") 文件描述符复制成句柄
-
-
die($errstr) or warn($errstr)
-
die 向STDERR输出指示错误信息的串,然后退出程序
-
warn 只输出信息,不退出程序
-
$!最后一次错误的信息,和die warn结合使用
-
die($str)中$str最后不是/n时,输出自动添加 "at 程序名 line 行号"。
-
-
-
close(F)
-
重新打开已经打开的文件,先关闭再打开
-
程序退出时自动关闭
-
关闭时才开始真正写文件,一般将文件内容先写到称为文件缓冲区的内存中,缓冲满时才写入磁盘。
-
$|变量决定是否有文件缓冲,$|=1无缓冲,只对当前输出文件有效。对其他文件,要先用select(F)。select(F)设置当前文件,返回原文件句柄。设置完再select(OLD)返回原文件。
-
-
文件缓冲
-
缓冲 无缓冲
-
打开:open,sysopen sysopen
-
关闭:close
-
读: <>,readline sysread
-
写: print syswrite
-
定位: tell, seek sysseek
-
-
-
其他文件打开函数
-
间接文件变量:$a="F"; open($a,"mode","path");
-
sysopen(H,name,m|o|d|e,pri);
-
模式mode: O_RDONLY, O_WRONLY,O_RDWR,O_CREAT,O_EXCL,O_APPEND, O_TRUNC, O_NONBLOCK,O_SHLOCK, O_EXLOCK,O_BINARY,O_NOCTTY, O_SYNC
-
权限pri: 类似unix 0755的数字
-
-
IO模块: $fh=IO::File->new(">$f"); new($f,O_WRONLY); new($f,"r+“);
-
< RDONLY "r"
-
> WRONLY|TRUNC|CREAT "w"
-
>> WRONLY|APPEND|CREAT "a"
-
+< RDWR "r+"
-
+> RDWR|TRUNC|CREAT "w+"
-
+>> RDWR|APPEND|CREAT "a+"
-
-
-
读文件
-
$line=<file> 读一行到$line,指针后移一行。缺省读到$_中,以$/作为行分隔符
-
@array=<file> 文件内容全部读出,含回车符。当从STDIN中读时,可省略为<>
-
read(F,$in,len[,$offset]) 读入$in
-
sysread(F,$in,len[,$offset])
-
getc(F) 读一个字符
-
-
命令行参数@ARGVif (defined($ARGV[0]))
{
$Para1 = $ARGV[0];
} -
写文件
-
-
print F ("str"); ()可省略
-
Printf("format str",$a,$b...) 类C
-
Write格式化输出
-
Syswrite(F,$data,length,$offset) 同sysread
-
-
文件权限
-
-
chmod(mode,filelst);
-
chown(userid,groupid,filelist) 改变文件的用户与组
-
umask(maskval) 返回原mask
-
-
文件测试 -op expr if (-e "file1"){print STDERR ("file1/n");} 文件是否存在
-w 文件或目录可写
-x 文件或目录执行
-o 文件或目录归用户所有
-R 文件或目录对真正用户可读
-W 文件或目录对真正用户可写
-X 文件或目录对真正用户执行
-O 文件或目录归真正用户所有
-e 文件或目录存在
-z 文件存在且大小为0
-s 文件或目录存在且不为0(返回字节数)
-f 文件为普通文件
-d 文件为目录
-l 文件为符号链接
-p 文件为命名管道(FIFO)
-S 文件为一个套口(socket)
-b 文件为块特殊文件
-c 文件为字符特殊文件
-t 打开tty控制台的文件句柄
-u 文件或目录是设置用户ID号
-g 文件或目录是设置用户组ID号
-k 文件或目录的sticky位置位
-T 文件是文本文件
-B 文件是二进制文件
-M 以天为单位的存在时间
-A 以天为单位访问时间
-C 以天为单位同代码更改时间-
-
-
-
-
定义
-
返回值
-
缺省子程序中最后执行的一个语句值将用作返回值
-
return(retval); 退出子程序并返回值retval
-
return; 返回错误undef
-
eval('subname'); 用该函数,错误由$@取得
-
-
参数传递
-
调用:
-
&sub1($number1,$number2,$number3);
-
sub1(1,2) 必须在该语句前已经定义
-
sub subname; subname(1,2); sub subname{} 前向引用
-
do subname(1,2); 相当于&subname(1,2)
-
()可以省略,但可能引起优先级问题: subname(1,2); subname 1,2
-
-
定义:sub sub1{my($number1,$number2,$number3)=@_; ....} 所有参数在数组@_中
-
子程序中改变@_元素值,会改变主程序中的参数值
-
my $number1=shift; my $number2=pop; shift、pop一次取一个参数,对@_操作,shift取第一个参数,然后删除,pop取最后一个参数再删除。
-
用别名或引用传递。定义数组的别名(*)之后,如果有同名的简单变量,则对该变量也起作用
-
$foo=26; @foo=("here","is","a","list"); &testsub (*foo);
-
sub testsub {local (*printarray) = @_; $printarray = 61; } --》$foo = 61
-
-
用别名传递多个数组
-
@array1=(1,2,3); @array2=(4,5,6); &two_array_sub (*array1 ,*array2);
-
sub two_array_sub{ my( *subarray1, *subarray2) = @_; }
-
-
-
局部变量和全局变量
-
全局变量:不加说明的变量为全局变量,在子程序中改变会改变已有的值
-
局部变量my: 只在程序块{}中存在(子程序也是程序块的一种。程序块内部定义的程序块也可见),在程序块外销毁。在主程序开头定义时相当于全局变量。
-
局部变量local:不存在于主程序中,但存在于该子程序和子程序调用的子程序中。
-
sub spoof {local ($value) = "temporary"; tellme();}
-
sub tellme {print "Current value is $value/n"; }
-
用local,$value存在于子程序spoof和tellme中
-
如果改成my,$value存在于子程序spoof,不存在于tellme中
-
-
-
- 子程序(函数)
sub subname{statements;}&subname 调用自定义函数,subname内部函数sub subname($$){statements;}$$ 表示参数类型: $简单变量,@列表,%散列,&匿名子程序, *引用。前面加/表示强制类型一致。;分隔必选和可选参数/@$;$ 第一个参数为列表,第二个参数为简单变量,第三个参数为可选的简单变量
-