Perl学习笔记(二)

标量数据

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的内置警告信息

从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
  • 注意Perl中的判断和C语言不同的地方:if和while必须带花括号
获取用户输入
  • 行输入操作符
    注意:从读取的字符串是包含末尾的换行符的。实际应用的时候,我们往往不需要末尾的那个换行符,需要用chomp()操作符去掉。
#!/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值
    undef本身既不是数字也不是字符串,它完全是一种独立类型的标量值。

可以根据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"串接后存入该变量,如果初始值是某个字符串,那么就和以往一样,追加新的部分到字符串末尾。

  • defined函数
    为了判断某个字符串是否为undef,可以用defined函数,即如果是undef,该函数就返回假;否则,即使是空字符串,那也是已定义的值,函数返回真

你可能感兴趣的:(perl)