1. 概述
通过两个例子(1.4.1和1.5),了解了perl的运行过程和基本语法
注意到perl没有默认的多行注释,如果非要用,可以去网上查阅,还是有方法的
2. 标量数据
2.1 数字
2.1.1.所有数字内部表示都是一样的,用的是双精度
2.1.2.浮点数
1.25
255.000
255.0
7.25e45 #7.25x10 的 45 次方(一个大整数)
-6.5e24 # -6.5x10 的 24 次方(一个大的负数)
-12e-24 #- -12x10 的-24 次方(很小的负数)
-1.2E-23 #指数符号可以大写(E)
2.1.3.整数
0
2001
-40
255
61298040283768
最后一个读起来有些困难。Perl 允许用下划线来分隔它,因此可以像下面这样书写:
61_298_040_283_768
2.1.4.非十进制数
0377 #八进制数字 377,等同于十进制数字 255
0xff #十六进制数字 FF,等同于十进制数字 255
0b11111111 #等同于十进制数字 255
以下方式是便于读,perl允许加下划线
0x1377_0B77
0x50_65_72_7C
2.1.5.数字操作符
2+3 #2+3,5
5.1-2.4 #5.1-2.4,2.7
3*12 #3*12,36
14/2 #14/2,7
10.2/0.3 #10.2/0.3,34
10/3 #通常是浮点除,3.33333... ...
10.2%3.5会自动转换为10%3得1
2**3,表示 2 的 3 次方,等于 8
2.2 字符串
2.2.1.单引号字符串
除了反斜杠(/)在自己(/)和单引号(‘)之前要重新考虑,代表显示正常的反斜杠和单引号,其他都是正常字符。注意理解这句话,下面我做了实验,一个程序说明问题:
#!/usr/bin/perl
$a = 'Don/'t tell me that!I need to display the symbol // /n
';
print $a;
输出:
legend@ubuntu:~/data/study/perl$ perl 2.2.1
Don't tell me that!I need to display the symbol / /n
legend@ubuntu:~/data/study/perl$
程序中两个反斜杠作为转义符分别显示单引号和反斜杠,除此之外,其他的字符都不属于转义范畴,包括/n和接下来的回车键,都会照搬输出,明白?
2.2.2.双引号字符串
这种就比较复杂了,不过任何语言都逃不了,在双引号里面的字符中,如果又变量,会直接替换为变量的值,如果有反斜杠,需要仔细辨别它是否具有转义含义,下表列出了各种转义情况:
换行
/n
回车
/r
制表符
/t
formfeed
/f
退格
/b
响铃
/a
escape(ASCII 中的 escape 字符)
/e
任何八进制值(这里是,007=bell(响铃))
/007
任何十六进制值(这里是,007=bell)
/x7f
一个控制符(这里是,ctrl +c)
/cC
反斜线
//
双引号
/”
下个字符小写
/l
接着的字符均小写直到/E
/L
下个字符大写
/u
接着的字符均大写直到/E
/U
在 non-word 字符前加上/,直到/E
/Q
结束/L,/E 和/Q
/E
例子:
“barney”#等同于‘ barney’
“hello world/n”#hello world,换行
“ last character of this string is a quote mark:/”
the ”
“coke/tsprite”# coke, a tab(一个制表符), sprite
2.2.3.字符串操作符
2.2.3.1. 字符串连接符(.)
“hello”. “world” # 同于 “helloworld”
“hello”. ‘’ “ . world”#同于 “hello world”
‘ hello world’ .“ /n” #同于 “hello world/n”
2.2.3.2. 字符串重复符(x)
“fred”x 3 #“fredfredfred”
“barney”x (4+1) #“barney”x 5, “ barneybarneybarneybarneybarney”
5 x 4 #实际上等于“5” x 4 也就是“5555”因为x作为重复符左边必将是字符串,所以会自动把数字转换为字符串。
5 x 4.8 #会先把4.8向下取整为4
5 x 0.5 # 会把0.5变为0,这样就产生了一个空串
2.2.4.数字和字符串的自动转换
Perl会根据后面的操作符决定是否将数字和字符串进行相互转换
“4”*“8” #会得到32,后面是乘号,两边直接转换为数字
“legend4”*“8” #一样得到32,如果把4删掉,则为0
“Z”.5*7 #得到”Z35”
perl的自动转换不用害怕难控制,它其实设计的是很人性化的。
2.3 Perl内嵌的警告
打开警告:
运行时perl -w program
如果不想在运行时加参数,可以把参数加到脚本的第一行:#!/usr/bin/perl -w
perl5.6之后可以这样:
#!/usr/bin/perl
use warnings;
#这样同样打开了警告
如果用use diagnostics;则是显示比较长的诊断信息,不过这比较费资源,通常在手动运行调试的时候用perl -Mdiagnostics program来打开诊断功能
2.4 标量变量
标量变量在perl中由$开头,赋值时和取值时都要$,shell中只是取值时需要,c和awk中都不需要,这些要分清楚。
2.4.1.取变量名的风格
其实由很多中方式,不过只要保持一致就行了
推荐这种:$giveMeInitialCaps
2.4.2.二元赋值操作符
和c语言一样:
+=,-=,*=,/=,
特殊的多了一个字符串连接符.=
2.5 print输出
Print “hello world/n”; #输出字符串
print 6*7; #输出数字
print “the answer is”,6*7,”./n”; #输出一个列表
2.5.1.字符串中标量变量的内插
实际上就是双引号字符串的变量替换,如果不要变量内插,直接在$符号前加/转义就行了,这样就打印出了$符号。
花括号的用法:
$what = “brontosaurus steak” ;
$n=3;
print “fred ate $n $whats./n” #这样打印出来时什么?是$whats的值。要打印$what的值而且想直接在后面接s怎么办?
Print “fred ate $n ${what}s./n”
print “fred ate $n $what”.”s/n”
print “fred ate ”.$n.” ”.$what.”s/n”
2.5.2.操作符的优先性和结合性
4** 4** 2 #4**(3**2)
72/12/3 #(72/12)/3
36/6*3 #(36/6)*3
在第一条中,**是右结合的,所以右边的先进行计算。同样的,由于*/是左结合的,所以要从左到右计算。
2.5.3.比较运算符
数字和字符串分别为:
== eq
!= ne
> gt
< lt
>= ge
<= le
2.6 if控制结构
和c语言结构时一样的
if(true或者false)
{
语句;
}
也可以后接else
{
语句;
}
2.6.1.boolean值
perl和其他语言都不一样,它没有boolean类型,但是其他的类型可以有自己的boolean值,规则是:
数字:0则false,非0则true
字符串:“”则false,非空串则true,但是由于“0”和0可以相互转换,此时“0”被系统特殊地认为是false,这是唯一一个特例。
非数字或者字符串:将其转换为数字和字符串之后再按上规则判断。
2.7 用户输入
行输入操作符<STDIN>
它从标准输入读入下一行,默认时键盘,通常时perl等待用户输入一些字符,以换行结束输入。而此时<STDIN>的值最后都是以/n结尾,而实际上通常不需要这个符号,所以用chomp来去掉它
2.8 chomp
该函数需要传入一个字符串变量,把此变量最后的换行符删掉再赋值给该变量,注意如果最后有多个换行符,只删掉一个。
例子:
chomp($line=<STDIN>); #最常用的用法,直接把$line最后的换行删掉再赋值给$line
等价于:$line=<STDIN>;
chomp($line);
如果print chomp($line=<STDIN>); #会得到1,当然如果最后本来就没有换行,则得到0.
2.9 While控制结构
和c语言一样,没什么好说的
2.10 undef值
实际上它就是指变量没有被初始化而直接使用时候的值
有两种情况:
数字默认为0
字符串默认为空串
如果直接print $legend; #什么都不会打印,因为$legend被认为成了空串。
2.11 defined函数
顾名思义,其实就是判断传入的参数变量是否被定义了,具体实现上就是判断传入东西的值的是否是undef