Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1120339
  • 博文数量: 165
  • 博客积分: 5957
  • 博客等级: 大校
  • 技术积分: 2015
  • 用 户 组: 普通用户
  • 注册时间: 2010-11-24 15:04
文章分类

全部博文(165)

文章存档

2014年(10)

2013年(14)

2012年(9)

2011年(22)

2010年(17)

2009年(17)

2008年(26)

2007年(34)

2006年(16)

我的朋友

分类:

2008-03-04 18:46:35

【1】$_ ---“默认值”.
$_ = "Dark side ...";
print ; # prints the value of $_
 
$! ---它总是设置为系统需要的最后一个操作
open(Myfile,"myfile") ||die "Cannot open myfile: $! \n";  #出错则中断程序
open(Myfile,"myfile") ||warn "Cannot read output: $!";  #warn将保持程序继续运行
不要使用$!的值来检查系统函数的运行是失败还是成功。只有当系统执行一项操作(比如文件输入或输出)之后, $!才有意义,并且只有在该操作运行失败后, $!才被设置。在其他时间中, $!的值几乎可以是任何东西,并且是毫无意义的。
 
qq和q运算符:qq取代了双引号,q运算符取代了单引号:
qq(I said,"Go then," and he said "I'm gone");
q(Tom's kite wedged in Sue's tree);
qq和q运算符可以使用任何非字母、非数字字符来标记字符串的开始和结束。使用任何一个成对的界限符,
如(),<>,{} ,[],它们都能够正确地将字符串括起来。
q/Tom's kite wedged in Sue's tree/;
q(Joe (Tom's dad) fell out of a (rather large) tree.);
 
【2】用文件句柄读取的所有数据中,除了包含文件行中的文本外,还包含行尾字符。如果只需要文本,请在输入行上使用chomp,以便舍弃行尾字符。
当你的perl程序启动运行时,它会得到3个自动打开的文件句柄。它们是STDOUT(标准输出)、STDIN(标准输入)和STDERR(标准错误)。按照默认设置,它们均与你的终端相连接。
$guess = ;
print "HELLO"; # 等同于 print STDOUT "HELLO";
将出错消息写入STDERR文件句柄是一种传统的做法。die和warn函数都能够将它们的消息写入STDERR,如果你的操作系统没有单独的报告错误的文件句柄,比如像Windows或DOS那样,那么STDERR输出将被送往STDOUT设备.
如果操作二进制文件,必须使用binmode
open(FH,"camel.gif") || die "$!";
binmode(FH); #只能对文件句柄使用一次该函数
如果在不能区分二进制文件和文本文件的系统(UNIX或Macintosh)上使用binmode函数,不会造成任何危害。
 
【3】“一行输入”通常是指发现第一个行尾序列之前的文本流。在UNIX中,行尾是一个换行符(ASCII 10);在DOS和Windows中,它是回车符与换行符的序列(ASCII 13、10)。这个默认行尾值可以被Perl进行操作
 
【4】
用法举例                             结果
int(5.6234)         返回它的参数的整数部分( 5)。
length ("nose")      返回它的字符串参数的长度( 4)。
lc("ME TOO")        返回它的转换成小写字母的参数(" me too ")
uc("hal 9000")      返回与l c相反的参数值("HAL 9000")
cos(50)             返回弧度50的余弦值(.964966)
rand(5)             返回从0到小于该参数值之间的一个随机数字。如果该参数被省略,则返回0至1之间的一个数字
 
【5】
表达式                             真还是假
0                    假。数字0为假
10                   真。这是个非0数字,因此是真
9>8                  真。关系运算符将根据你的期望返回真或假
-5+5                 假。这个表达式计算后得出的结果是0,而0是假
0.00                 假。这个数字是0的另一种表示法, 0 x 0,0 0,0 b 0和0 e 0 0也是一样
""                   假。空的字符串是假
" "                  真。引号中有一个空格,这意味着它们并不是完全空的
"0.00 "              真。真奇怪!它已经是个字符串了,而不是“ 0”或“”。因此它是真
"00"                 也是真,原因与“0.00”相同
"0.00"+0             假。在这个表达式中,对0.00 + 0进行了计算,结果是0,因此这是假
 
【6】
替代名              举例                分析
and              $s && $t         只有当$s和$t都是真时,才是真
                 $q and $p        只有当$q和$p都是真时,才是真
or               $a || $b         如果$a或$b是真,则为真
                 $c or $d         如果$c或$d是真,则为真
not              ! $m             如果$m不是真,则为真
                 not $m           如果$m不是真,则为真
 
【7】
运算符   举例                     结果
-r    -r ‘file’         如果可以读取‘file’,则返回真
-w    -w $a            如果$a中包含的文件名是可以写入的文件名,则返回真
-e    -e ‘myfile’       如果‘myfile’存在,则返回真
-z    -z ‘data’         如果‘data’存在,但是它是空的,则返回真
-s    -s ‘data’         如果‘data’存在,则返回‘data’的大小,以字节为计量单位
-f    -f ‘novel.txt’    如果‘novel.txt’是个普通文件,则返回真
-d    -d ‘/tmp’         如果‘/tmp’是个目录,则返回真
-T    -T ‘unknown’      如果‘unknown’显示为一个文本文件,则返回真
-B    -B ‘unknown’      如果‘unknown’显示为一个二进制文件,则返回真
-M    -M ‘foo’         返回程序启动运行以来‘foo’文件被修改后经过的时间(以天数计算)
 
【8】模式匹配
默认对$_进行匹配
if (m:/usr/local/nagios/etc/:) { print; } #不使用/时,m不可省略
if (/collectd/) { print; }  #使用/,可以省略m
if (s#street#avenue#) #不使用/时,s不可省略,如果未find street,则if不执行
.用于匹配除了换行符外的任何单个字符.要求存在一个字符
/p.t/ 不匹配apt
+用于匹配1个或多个前面的字符
*用于匹配0个或多个前面的字符
?用于匹配0个或1个前面的字符
.*匹配任何东西
 
pat{n, m},n是匹配的最小次数,m是匹配的最大次数,pat是你试图量化匹配的字符或字符组。可以省略n,也可以省略m,但是不能同时省略n和m

/x{5,10}/  x至少出现5次,但是不超过1 0次。
/x{9,}/  x至少出现9次,也可能出现更多次。
/x{0,4}/  x最多出现4次,也可能根本不出现。
/x{8}/  x必须正好出现8次,不能多,也不能少。
[^a-e] 用于匹配非a、b、c、d或e中的任何一个字符
[0-9]+ 用于顺序匹配一个或多个数字
[A-Za-z]{5} 用于匹配任何一组5个字母字符
[*!@#$%&()] 用于匹配这些符号中的任何一个 #大多数通配符在这里会失去它们的"通配符性质"
 
用字符类的快捷方式。它们用反斜杠和通配符来表示:
\w 一个单词字符,与[a-zA-z0-9_]相同
\W 一个非单词字符(与\w相反)
\d 一个数字,与[0-9]相同
\D 一个非数字
\s 一个白空间字符,与[\t\f\r\n]相同
\S 一个非白空间字符
 
| -- 相当于or,配合()使用,效果不错
/(fr|b|l|fl|cl)og/  这个表示也相当于 /(fr|b|(f|c)l)og/
 
理解一下这个例子:
$_="apple is red";
($fruit,$color) = /(.*)\sis\s(.*)/;
 
s/^\s+//; # remove leading spaces, if any; 1个或多个
if(s/^\s*(kg|kilogram)s?.*//); # 如果找到匹配,则 del kgs? or kilograms?,然后继续执行if,否则if不执行
 
/^/ 用于匹配带有开头字符的行(所有行),不匹配白空间字符。/$/的作用也相同
 
如果要对非$_的变量使用匹配,需要用到连接运算符=~
=~运算符并不进行赋值,它只是取出右边的运算符,并使它对左边的变量进行操作
$poem="One fish , two fish, red fish";
$n=$poem=~m/fish/; # $n is true(1) , if $poem has fish , 否则$n为空
 
替换运算符(s///)和匹配运算符(m//),如果匹配项的后面跟一个字母i的话,能够在匹配正则表达式时不考虑大小写字母,即(s///i)或者(m//i)
用于匹配和替换的另一个修饰符是全局匹配修饰符g,即(s///g)或者(m//g)
看下这个例子,理解@F和@G的区别:
#!/usr/bin/perl --
$_="One fish , two frog , red fred , blue foul";
@F=m/\Wf\w\w\w/g;  #变量@F将包含4个元素,即' fish',' frog',' fred'和' foul';
@G=m/\W(f\w\w\w)/g; #变量@G将包含4个元素,即'fish','frog','fred'和'foul';
print "@F\n@G";
 
继续理解g选项,看这个例子
$letters=0;
$phrase="What's my line?";
while($phrase~=/\w/g) #直到匹配代码返回假为止
{
    $letters++;
}
print $letters; #$letters is 11
 
为了匹配一定格式的电话号码,比如800-555-1212:
#!/usr/bin/perl --
$_ = '800-555-1212';
if(/(\d{3})-(\d{3})-(\d{4})/){
    print "The area code is $1\n";
}
if(s/(\d{3})-(\d{3})-(\d{4})/Area is $1 , phone is $2-$3/g)
{
    print;
}
阅读(2184) | 评论(0) | 转发(0) |
0

上一篇:perl习惯用法

下一篇:erlang基础练习

给主人留下些什么吧!~~