第二章 标量数据
Perl中的标量表示的范围很大,包括数字和字符/字符串。而且数字也不像c中有浮点数,单精,双精,整数...之分,只要是数字就是标量。而且所有的数字其内部格式都一样,perl将整数保存为浮点数,计算也是按照浮点数进行计算。
数字的表示方法:(在这方面还是可以看出perl的随意性)
1.25
255.000
7.25e45
-6.5e24
-12e-24
-1.2E-23
0
-40
61298040283768
61_298_040_283_768 (这个数字和上面的表示方法是相同的,只是现实生活中是用逗号,而这里是用_。因为逗号已经有了更重要的作用)
0377 (八进制的377)
0xff (十六进制的FF)
数值操作符:
2+3 (2加3=5,也可以在加号左右加上空格。perl这方面要求很宽松,下面等同)
5.1-2.4 (5.1减2.4=2.7)
3*12
14/2
10.2/0.3
10/3
10%3(取余,需要指出的是,如果2个数值是小数,则perl的处理方式先将小数化为整数,如10.5%3.2是按照10%3来计算的)
2××3 (2的3次幂)
单引号字符串: 单引号本身不是字符串的一部分,用来让perl确定字符串的开始和结束。里面就是字符的实际意思,不像双引号字符串有很多转义。不过如果在单引号中要表示单引号和反斜杠怎么要在前面多加一个反斜杠。
'fred'
''
'hello/n' (这里/n不是回车换行符,只是2个字符)
'/'//' (一个单引号,一个反斜杠)
双引号字符串:将可以解释很多转义字符(见下表),并且双引号里可以内插变量。
"barney" (和'barney'一样的意思)
"Hello world/n"
写法 | 含义 |
/n | 换行 |
/r | 回车 |
/t | 制表符 |
/f | 换页 |
/b | 退格符 |
/a | 响铃 |
/e | Esc |
/007 | 任意的ASCII码的八进制值(这里007=响铃) |
/x7f | 任意ASCII码的十六进制值(这里7f=删除) |
/cC | 任意Ctrl键组合字符(这里是Ctrl-C) |
// | 反斜杠 |
/" | 双引号 |
/l | 下一个字母小写 |
/L | 所有后面的字母小写直到/E |
/u | 下一个字母大写 |
/U | 所有后面的字母大写直到/E |
/Q | 添加反斜杠引用后面的非单词字符,直到/E |
/E | 结束/L、/U或/Q |
字符串操作符:"." 和 "x"
.操作符就是用来字符串连接的
"hello" . "world" (结合起来就是"helloworld")
"hello" . ' ' . "world" (结合起来就是"hello world")
x操作符叫做串重复操作符,后面跟数字代表重复次数
"fred" x 3 (fredfredfred)
5 x 4 (5555,注意,这里也只能是整数进行串重复操作,如果小于1则等于空)
数字和字符串的自动转换:
在大多数情况下,Perl会根据操作符来自动判断对象是字符串还是数字。这方面perl的处理很智能化,你可以开启perl的警告开关,这样你如果用的不合适,perl会提示你。也就是我在第一章里的说的-w开关,用在perl程序的第一行。
标量变量:
Perl的变量是以美元符号$开头的,以字母或者下划线开头,并且分大小写!
二元赋值操作符:
$fred += 5; (等于$fred = $fred + 5)
$fred *= 3; (等于$fred = $fred * 3)
$str .= " " (等于$str = $str . " ")
优先级:
Perl的优先级和C一模一样^_^
比较操作符:
还是列一张表吧,看起来比较清楚:
比较 | 数值 | 字符串 |
相等 | == | eq |
不相等 | != | ne |
小于 | < | lt |
大于 | > | gt |
小于等于 | <= | le |
大于等于 | >= | ge |
两点提示:
- 和shell的处理方式正好相反,一般人还是比较习惯这里的处理方式。
- 如何记忆字符串的关键字:其实都是英文单词的所写,只要弄明白什么意思就ok了。具体如下(不一定准确^_^,方便记忆就好):eq=equal、ne=not equal、lt=less than、gt=great than、le=less than、ge=great than
if控制结构:
通过举例来说明if语句的结构:
if ($name gt 'fred') {
print "'$name' comes after 'fred' in sorted order./n";
}
这是最简单的if语句,没有else段。下面再在上面的基础上加上else:
if ($name gt 'fred') {
print "'$name' comes after 'fred' in sorted order./n";
} else {
print "'$name' does not come after 'fred'./n";
print "Maybe it's the same string, in fact./n";
}
看到这里我有个疑问。这两个例子都是书上照搬下来的,按照我前面看的结果应该在print语句中$name不应该加上单引号,这样才能真正显示变量的内容。如果加了单引号不是就代表$name了?马上试验做分晓:在这段例子前面我加了$name="marco";
但是结果的显示:
bash-2.05$ ./test.plx
'marco' comes after 'fred' in sorted order.
说明单引号还是可以解释变量内容的。不过我再继续验证单引号是否真的可以解释变量,因此很简单的写了几句话:
#!/usr/local/bin/perl -w
$named="marco";
print '$named';
结果确实报错信息:
bash-2.05$ ./test.plx
Name "main::named" used only once: possible typo at ./test.plx line 2.
如果再在单引号的两边加上双引号就ok了。输出结果如下:
'marco'
原来如果单引号放在双引号里面时,单引号就是单引号,没有任何其他意义。ok,明白了^_^
如何判断布尔值的真假?
如果标量值为undef、0、''、或者'0',那它就是假的。其他都为真。
取得用户输入:
应该有很多方法,不过现在先介绍这个操作符。一样,举例来说明:
$line=;
if ($line eq "/n") {
print "That was just a blank line!/n";
} else {
print "That line of input was: $line";
}
值得注意的是由于是以回车做为结束的。但是它也会将回车换行符放入变量中。因此就需要chomp这个非常有用的操作符了^_^。
chomp操作符:
真的是非常有用的一个参数。几乎每个程序都会用到。它实际上是一个函数。它的作用是去掉结尾的一个换行符,如果有2个或者2个以上那就要用同样数字的chomp。
最常用或者说最酷的使用方式是:
chomp($test=);
中规中矩的使用方式是:
$test=;
chomp($test);
推荐使用第一种,这样看起来才象一个Perl程序员^_^。
while控制结构:
例子:
$count=0;
while ($count<10) {
$count += 1;
print "count is now $count/n";
}
不用多解释了,相信是地球人都看的懂的程序^_^。
undef值:
变量在第一次赋值之前它的值就是undef。如果把undef做为数字使用,其功能相当于0,因此它可以很方便的生成一个以空开始的数值累加器:
#累加一些奇数:
$n=1;
while ($n < 10) {
$sum += $n;
$n += 2;
}
print "The total was $sum./n";
这个程序中$sum一开始没有指定值,因此它开始是undef,因为是数字的加法,因此它就被用作0了。
而当这个变量被用作字符时,它的作用和空字符相似。
defined函数:
是专门用来检测变量是否为undef的一个函数,例子:
$madonna = ;
if ( defined($madonna) ) {
print "The input was $madonna";
} else {
print "No input available!/n";
}
习题:题目都可以在5分钟之内完成,不难。不过还是值得做一做的,特别是新手。我算新手,因此都认真做了每一道题目^_^
1. 写一程序,计算半径为12.5的圆的周长。周长是半径的2pi倍(近似于2乘以3.141592654)。你得到的答案应该是大约78.5。
2. 修改上一道题的程序,提示用户输入,并接受用户所输入的一个半径值。这样用户如果输入12.5,她就应该得到与上一道题一样的答案。
3. 修改上一道题的程序,当用户输入一个小于0的数字时,得到的周长应该是0,而不是负数。
4. 写一个程序,提示用户输入并读入两个数字(各占一行),然后打印出两个数相乘的结果。
5. 写一个程序,提示用户输入并读入一个字符串和一个数字(各占一行),然后在不同的行上重复打印该字符串,重复次数由该数字指定。