perl的数据类型非常简单,第一种数据类型称为scalar(标量),一般用于表示数字或者字符串。
两种标量的使用:
一种是标量数据,表示数据的值;一种是标量变量,表示存储标量数据的容器。
Perl处理数字时使用的是底层C库,且统一使用双精度浮点数来存储和计算数据(双精度浮点数,使用8字节,共64位来存储一个浮点数)
整数直接量:就是在源代码中直接写成数据内容的形式。
写法如下:
0
2001
-40
137
61298040283768
最后一数字比较长,Perl中允许你在整数直接量中加入下划线。将若干位数分开,写成下面这样:
61_298_040_283_768
两种写法对计算机来说都表示一个数字。
Perl提供乘幂运算符,即两个**,比如2**3表示2的3次方,结果是8。
字符串:Perl完全支持Unicode,所以在字符串中可以使用任意一个合法的Unicode字符。但由于历史原因,它不会自动将程序源代码当作Unicode编码的文本文件读入,所以如果想在源代码中使用过Unicode书写直接量的话,需要手工加上utf8编译指令
注:
最好养成习惯始终加上这句
use utf8;
字符串的连接使用.
操作符
"hello".“world” #等同于“helloworld”
"hello"." "."world" #等同于"hello world"
小写的字母x,此操作符会将其左边的操作数(也就是要重复的字符串)与它本身重复连接,重复次数则由右边的操作数(某个数字)指定,例子:
“fred” x 3 #得“fredfredfred”
"barney" x (4+1) #得"barney" x 5 ,即“barneybarneybarneybarneybarney”
5 x 4.8 #本质上就是"5" x 4,所以得“5555”
从Perl 5.6开始,可以通过编译指令启用警告机制
1.
#!/usr/bin/perl
use warnings;
2.也可以在命令行调用程序时使用-w选项启用警告机制
$ perl -w 1.pl
3.也可以在第一行这样启用
#!/usr/bin/perl -w
如果看不明白警告信息说的是什么,可以利用diagnostics编译指令,在perldiag文档中列出每个警告信息的简短描述和详尽解释
use diagnostics;
把这条加进去之后,程序启动可能会有些慢。(也可以使用命令行的-M选项)
可以使用hex()或者oct()函数将字符串转换为对应的数字。
hex('DEADBEEF') #即十进制数字 3_735_928_559
hex('0xDEADBEEF') #即十进制数字 3_735_928_559
对于一些特殊字符的输入,可以使用代码点(code point),比如
$alef = chr(0x05D0);
$alpha = chr(hex('03B1'));
$omega = chr(0x03C9);
或者已知字符,要取得他的代码点,可以通过ord()函数转换:
$code_point = ord('א')
比较 | 数字 | 字符串 |
---|---|---|
相等 | == | eq |
不等 | != | ne |
小于 | < | lt |
大于 | > | gt |
小于或等于 | <= | le |
大于或等于 | >= | ge |
#!/usr/bin/perl
$line = ;
if($line eq "\n")
{
print "That was just a blank line!\n";
}else{
print "That line of input was:$line";
}
chmop()操作符:去掉字符串末尾的换行符,如果没有,就啥都不干。
chmop()本质上是函数,它的返回值是实际移除的字符数,但这个数字几乎没用。
注意:如果字符串后面有两个以上的换行符,chomp()只去掉最后的那个;如果末尾没用换行符,就啥也不干并返回0。
chomp($text = ); #读取不带换行符的输入
#下面是另一种写法
$text = ;
chomp($text);
下面再介绍一个例子:
$food = ;
$betty = chomp $food; #会得到返回值1————我们之前已经知道了
这里用chomp()的时候没有加括号,对于函数而言这种括号是可加可不加的,这是Perl的另一项惯例:除非去掉括号会改变表达式的意义,否则括号可以省略。
可以根据undef作为数字使用时会被视作为数字0,构造一个数字累加器,在开始累加前完全不用做任何初始化工作:
#累加一些奇数
$n=1;
while($n<10)
{
$sum+=$n;
$n+=2; 准备好下一个奇数
}
print "The total was $sum.\n";
循环开始前$sum的初值是undef,由于我们把undef当成数字用,相当于0,所以累加的结果就是1。同样的道理,串接字符串的时候也不用刻意的去进行初始化:
$string .= "more text\n";
如果$string的值起初是undef,那么这个串接操作的结果就好比是空字符串和"more text\n"串接后存入该变量,如果初始值是某个字符串,那么就和以往一样,追加新的部分到字符串末尾。