第二章 標量資料
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',那它就是假的。其他都為真。
取得使用者輸入:
應該有很多方法,不過現在先介紹<STDIN>這個操作符。一樣,舉例來說明:
$line=<STDIN>;
if ($line eq "/n") {
print "That was just a blank line!/n";
} else {
print "That line of input was: $line";
}
值得注意的是由於<STDIN>是以斷行符號做為結束的。但是它也會將斷行符號分行符號放入變數中。因此就需要chomp這個非常有用的操作符了^_^。
chomp操作符:
真的是非常有用的一個參數。幾乎每個程式都會用到。它實際上是一個函數。它的作用是去掉結尾的一個分行符號,如果有2個或者2個以上那就要用同樣數位chomp。
最常用或者說最酷的使用方式是:
chomp($test=<STDIN>);
中規中矩的使用方式是:
$test=<STDIN>;
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了。
而當這個變數被用作字元時,它的作用和Null 字元相似。
defined函數:
是專門用來檢測變數是否為undef的一個函數,例子:
$madonna = <STDIN>;
if ( defined($madonna) ) {
print "The input was $madonna";
} else {
print "No input available!/n";
}