标量的概念
Perl使用标量来称呼单个事物,标量是Perl中最简单的一种数据类型。标量可分为两种:数字和字符串。在Perl程序内部,这两种类型是可以内部转换的,所以对于Perl来说,所有的标量没有本质区别。
数字直接量
数字直接量是某个数字在Perl源代码中的写法,分为浮点数直接量与整数直接量,分别表示浮点数与整数。其写法与普通的数字没有明显区别。当数字很长时,可以在数字中加入下划线分隔,这样做不会改变原数字的意义。例:
2015 -2 3.14159 123_456_789 #各种数字直接量
字符串
字符串就是一个字符序列,其可以由任意长度字符任意组合而成。最短的字符串不包含任何字符,即空字符串。字符串的内容一般为数字,大小写字符,各种符号,以及其他特殊内容等。
同数字直接量,Perl中字符串直接量也有一定的书写方式。其分为两种不同的形式:单引号内的字符串和双引号内的字符串。
单引号内的字符串直接量
单引号内的字符串直接量指使用一对单引号圈引的一个字符串。单引号可以让Perl识别字符串的开头与结尾,即起到划定范围的作用。在单引号内,除了反斜线和单引号,其他所有的字符都代表其本身而没有其它含义。所以单引号一般用于安全地书写纯字符内容。如果需要表示单引号或反斜线本身,需要在其前面加上一个反斜线,表示转义。例:
‘fred’ #字符串fred
‘’ #空字符串
‘\\n’ #字符串\n
‘\’\\’ #一个单引号和一个反斜线
双引号内的字符串直接量
双引号内的字符串直接量使用一对双引号圈引。在双引号中主要有两大功能特性:反斜线转义与变量内插,变量内插将在下文中提及。反斜线转义指用一个反斜线加上某个字符,可以表示许多特殊的意义。常用的反斜线转义有:
\n #换行符
\L #将后面所有字母转为小写
\l #将下个字母转为小写
\U #将后面所有字母转为大写
\u #将下个字母转为大写
\E #结束\U与\L的作用范围
数字与字符串操作符
Perl提供了各种常用的数字运算操作符与字符串操作符。常用的数字操作符有:
3+2 3-2 3*2 3/2 #3加/减/乘/除2
3%2 #3除2取余
3**2 #3的2次方
int(3/2) #3除2取整
注意:取余操作符会先对两边的操作数都进行取整再进行运算。int是取整函数,可以对其参数进行取整。
字符串操作符用于对字符串进行处理。常用的有“.”和“x”操作符。“.”是字符串连接操作符,其可将多个字符串无缝连接,得到一个更长的字符串。“x”是字符串重复操作符,其可将操作符左边的字符串,以右边操作数的次数进行重复连接。当右边的操作数不为整数时,会先对其取整再进行连接。如果右边的操作数为0,则会得到空字符串。例:
‘f’ . ‘r’ . ‘e’ .‘d’ #得到‘fred’
‘fred’ x 3 #得到‘fredfredfred’
各种操作符之间具有一定的优先级,在一般情况下,可以利用括号的最高优先级,将先运算的部分放入括号内,从而不会出错且清楚直观。
数字和字符串之间的自动转换
Perl会根据操作符的需要,自动地在数字和字符串这两种标量类型之间进行转换。如果操作符需要的是数字,就会将其两边的操作数视为数字处理,而如果操作符需要的是字符串,则会将其两边的操作数视为字符串处理。字符串转为数字时,字符串的非数字部分会被略去,即字符串必须以数字开头,从第一个非数字字符开始的全部内容会被略去。而如果字符串被略去了所有字符,则会被转换为数字0处理。例:
‘1ab’ #会被转换为数字1
‘ab1’ #会被全部略去,转换为数字0
‘ab’.1 #右边的1会被转换为‘1’
标量变量
变量就是存储一个或多个值的容器,而标量变量就是只存储一个标量值的容器。后续还有数组变量和哈希变量等,这些都是可以存储多个值的变量。变量的名称在整个程序中保持不变,但其值可以不断改变。
标量变量以“$”开头,表示“取单个东西”或“取标量”,这个符号也称为“魔符”。$后接变量的名称,其属于Perl标识符的一种。标识符是Perl中的一类用于定义许多事物(如这里的标量变量)名称的一串字符,其必须由字母或下划线开头,后可以接多个字母、数字或下划线,一般不建议使用全大写标识符,因其容易与Perl的特殊标识符相冲突。习惯上标识符应全小写。例:
$m $n $i #一些标量变量
变量的赋值与双目赋值操作符
单个标量可以被存储进标量变量中,这样的操作就称为对变量赋值。Perl中的赋值操作符为等号,等号的左边为变量,右边为值,表示将右边的值赋值给左边的变量。赋值操作时,会先对赋值式右边的内容进行运算、取值,最后再赋值给变量,即变量存储的是最终的计算结果或字符串。Perl中,使用分号来分隔每一行的程序源代码。例:
$n=1; #$n为1
$m=1+2; #$m为3
$i=$n+$m; #$i为4
$a=‘abc’ . ‘def’; #$a为‘abcdef’
赋值操作时常常需要对一个变量的值进行运算,再将结果存回原变量中,从而实现了变量内容的更新。这种操作十分常见,所以Perl为其提供了简写,即使用双目赋值操作符。双目赋值操作符由一个运算操作符加上等号组成,操作符的左边为变量,右边为运算符的操作数。例:
$n+=3; #等同于$n=$n+3;
$m**=3; #等同于$m=$m**3;
$i.=‘fred’; #等同于$i=$i .‘fred’;
“.=”又称追加操作符,由字符串连接符和等号组成。可以在原变量的后面添加字符串,再存入原变量。
标量变量内插
上文提到,双引号圈引的字符串中可以使用变量内插。变量内插即将变量书写在双引号圈引的字符串中。在这个字符串被调用时,所有内插的变量都会被替换为该变量当前的值。如果不想使用变量内插,可以用单引号圈引字符串,或使用反斜线转义来表示$本身。进行变量内插时,Perl会尽可能使用最长且合法的变量名称,所以当变量名后紧跟着一些字符时,就会对变量名造成歧义。解决办法为:用一对花括号围住变量名,来限定其范围。如果整个字符串只由一个标量变量组成,则可省略该变量两边的字符串引号,这个简写常用于print后(稍后提到)。例:
$n=3;
$m=“1 2 $n”; #$m为“1 2 3”
$q=“\$n”; #$q为“$n”
$r=“ab${n}cd”; #$r为“ab3cd”
、chomp与print操作符初步
被称为行输入操作符,其作用为从键盘上读取一行(或多行)用户输入。读取的内容可以赋值给变量,从而进行其他操作。输入内容完毕后,按回车键结束输入,从而继续进行下面的程序。
在使用行输入操作符录入数据时,由于数据录入以回车键结束,所以录入数据的每一行的最后一定会被带上一个换行符。此时如果需要去掉换行符,就可以用到chomp操作符。chomp操作符可以作用于单个字符串,去掉其末尾的一个换行符。最常见的用法是与赋值式连用,先赋值,再去掉其末尾换行符。chomp本质上是函数,会返回去掉的换行符数,但这个返回值没有太大意义。
print操作符可以输出任何指定的内容到屏幕。在只需要输出一个标量变量时,可以省略变量两边的字符串引号。例:
print'HelloWorld!'; #输出“Hello World!”到屏幕
chomp($n=); #从键盘读取一行输入并存入$n,并去掉其末尾的换行符
print$n; #输出$n的内容到屏幕,省略引号
比较操作符与逻辑运算初步
Perl中有一套可以用于数字比较和字符串比较的操作符。字符串比较按照ASCII编码的顺序决定先后。这些操作符可以返回真值或假值,从而被用于逻辑运算。常见的比较操作符列举如下:
比较 数字 字符串
等于 == eq
不等于 != ne
小于 < lt
大于 > gt
小于等于 <= le
大于等于 >= ge
常见的比较操作举例:
2==2 #True
‘abc’ eq‘abc’ #True
2>3 #False
3!=3 #False
Perl中有一整套的逻辑运算操作符,可以用来进行逻辑运算。常用的逻辑运算操作符列举如下:
|| #逻辑或
&& #逻辑与
! #逻辑非(单目取反操作符)
and #低优先级的逻辑与
or #低优先级的逻辑或
xor #逻辑异或
not #低优先级的逻辑非
简单的逻辑运算操作举例:
(1==2)||(1==1) #True
1==2 or 1==1 #True
(1==2)&&(1==1) #False
1==2 and1==1 #False
!(1==1) #False
布尔值
Perl中,任何标量值都有逻辑上的真假之分。当一个标量值作为逻辑运算的真假值进行处理时,这个值就称为布尔值。布尔值的真假由以下规则来判定:
如果标量值为数字,则0为假,其他为真。
如果标量值为字符串,则空字符串和‘0’为假,其他为真。
undef与变量值为undef的变量为假(详见“undef值”)。
布尔值有其默认的真假返回值。如果是真值,则默认返回的布尔值为1,如果是假值,则默认返回undef。例:
$n=1==1; #逻辑真值,比较操作符返回的布尔值为1,即$n为1
$m=1!=1; #逻辑假值,比较操作符返回的布尔值为undef,即$m为undef
if控制结构
if属于Perl的控制结构语句之一,即if条件语句控制结构。其代码由三部分组成:关键词、条件语句和代码块。关键词即语句名称if,条件语句是一个能返回布尔值的表达式,如逻辑运算式或标量变量等,其由一对小括号围住。代码块由一对花括号围住,在条件语句返回布尔真值时执行。
如果有多个判断条件需要依次判断时,可以继续使用elsif作多个追加判断,其用法类似于if。else可以在所有判断条件都不符时执行其代码块。例:
if($n>$m){
print"$n>$m"; #如果$n>$m,就执行这里的代码块
}elsif($n<$m){
print"$n<$m"; #如果$n<$m,就执行这里的代码块
}else{
print"$n=$m"; #如果上面都不符合,则执行这里的代码块
}
while控制结构
while是Perl中五大循环块之一,属于控制结构语句。其代码类似于if,也由关键词while、条件语句和代码块组成。while控制结构会先判断条件语句是否为真,如果为真,就执行代码块,完成之后会再次不断地进行这一循环,直到条件语句返回假,此时跳出while循环。例:
$m=10;
while($m){
$m-=1;
print$m; #当$m返回布尔真值时(即不为0时),不断执行这里的代码块,直到$m为0导致条件语句返回假时,跳出此代码块
} #结果为输出9到0这十个数字,$m为0时跳出循环
如果不小心运行了无限循环程序,可以按下ctrl+C强制终止程序运行。
undef值
Perl中有一个特殊类型的标量值,即undef值。undef的含义为未定义的,所以undef值即未定义值。它既不是数字也不是字符串,但其可以在需要时被转化为这两者进行处理。如果undef被当作数字使用,则其会被转化为0,而如果其被当作字符串使用,则会被转化为空字符串。当一个变量未被赋值时,这个变量的初始值就是undef,这是undef最常出现的情况。例:
$n+=1; #$n的undef值表现为0,所以结果为1
$m.='a'; #$m的undef值表现为空字符串,所以结果为‘a’
樱雨楼
完成于2016.1.1
最后修改于:2016.1.24