第二章 標量數據
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. 寫一個程序,提示用戶輸入並讀入一個字符串和一個數字(各佔一行),然後在不同的行上重複打印該字符串,重複次數由該數字指定。