Learning Perl 4ED Reading Notes
Chapter2 Scalar Data
1. Numbers. 所有的資料(int,float)在Perl內部都是double類型。當然,有的時候Perl在內部也會使用integer來表示int,因為這樣可以 提高程式的運行速度,但是這些邏輯對於程式員來說都是invisible的,所以,我們完全可以不用關心。
2. Floating-Point and Integer Literals. For example:
1.25
255.0
7.25e45
-12e-24
0
2001
-40
這樣的也是可以的:61_344_3434_878, 也是一個integer,用underscore格開純粹為了可讀性好,其實這就是一個integer。為什麼這裡不用逗號用underscore呢?這是因為逗號在Perl中還有其他用處。
3. 非十進位的資料。如:
0377 -- 八進位,相當於十進位255
0xff -- 十六進位
0b11111111 -- 二進位
只有Literal(常量)能用0x, 0b, 0這樣的字元打頭來表示非十進位數,如果是一個存放在string裡面的十六進位數,那就要用函數來把字串轉換成數字,比如用oct()函數可以 將"0377"轉換成八位元,用hex()函數將string轉換成十六進位數。但是沒有用於位元的轉換函式,用oct函數就可以實現,oct函數 可以把0b打頭的字串轉換成數字。
4. Numeric Operators. 加減乘除當然是可以用的,此外,和C一樣,用%表示取餘,和Pascal、C不一樣的是,Perl支援**操作符表示指數,比如2**3表示2的三次方,這是Pascal和C沒有的。
注意:用%取餘的時候,如果兩個運算元中有一個是負數,或者兩個數都是負數的情況下,不同的Perl實現(Perl解譯器)可能會給出不同的答案,Beware!5. Strings. Strings是一種可以包含任一字元序列的資料類型。除了常見的ASCII32~ASCII126之間這些鍵盤上可見的字元外,我們完全可以在String中放置任何資料,包括位元據。比如可以將一幅圖片放到一個String中。
注意:和C不一樣的是,Perl依靠字串的長度來判斷String的結尾位置,而不是依靠結尾的\0來判斷字串是否結束。
6. Single-Quoted String Literals and Double-Quoted String Literals. 和其他的語言一樣,被括在單引號中的字串,其中可以使用的東西較少。比如,在單引號覆蓋的字元中,引用Perl變數的特殊文法將不會生效,只有在雙引號 包含的字串中才會生效;又如,用backslash \來轉義,在單引號的字串中,只能用backslash轉義兩個字元,即\'和\\,前者表示一個單引號,後者表示一個backslash,除此以外, 使用backslash這個字元,就真的表示是一個backslash character。比如'hello\n'這個字串表示hello加上一個backslash,最後加上一個n,\n就不會被理解成斷行符號符。使用雙引 號就自由多了,用backslash可以轉義很多字元,詳情見附件1。
7. String Operators. 這裡介紹了兩個,第一個是.這個符號。和PHP一樣,這裡的. (a single dot)表示串連兩個字串,如"hello"."world"就表示"helloworld";第二個operator是x(小寫x字元),這個表示 重複,比如"fred"x3表示"fredfredfred"。這個x的倍數可以寫成一個float,此時Perl會自動將這個Float截斷成 integer然後操作,比如"fred"x4.8就表示"fred"x4,此外,如果這個倍數小於1的話,那麼我們就會得到一個empty(zero- length) string.
8. Automatic Conversion between Numbers and Strings. 在絕大多數情況下,Perl會為我們自動做String和Number之間的類型轉換,依據就是看operator,比如+,只有number才能做+的 動作,那麼Perl會自動將類型都轉換成number,比如遇到.,Perl就會自動將兩邊的操作對象都當作String處理(這就是為什麼Perl不 用+來用作字串的串連了)。有的時候Perl的自動類型轉換會變的非常神奇,比如"12fred34"*3,我們會得到36,即Perl從頭開始發現不 是數位時候將後面的捨棄,"12fred34"被當作12來處理了。如果一個String無法被轉換成Number,那麼Perl會把它變成0來處理。 自己嘗試一下即可。
Learning Perl 4ED Reading Notes
Chapter2 Scalar Data
9. Perl's Built-in Warnings. 本節很有用。首先用perl -w my_perl_program來執行我們的Perl程式就可以開啟所有的warning資訊;其次,也可以在我們Perl程式的第一行寫成這 樣:#!/usr/bin/perl -w,效果也是一樣;更有用的是,在Perl程式中寫入use diagnostics;一行代碼,可以開啟diagnostics資訊,比warning資訊更詳細和全面,查看perldiag的man手冊可以發現 更多資訊,不過,每次開啟和關閉diagnostics資訊都要去編輯Perl程式源碼,很煩,為此,我們也可以在命令列開啟diagnostics信 息,這樣:perl -Mdiagnostics my_perl_program,這樣的效果和在代碼中寫use diagnostics;是一樣的,不過這樣更自由。
10. Scalar Variables. 本節描述如何定義Perl中的變數,-- 用貨幣符號 $ ,這和shell編程是一樣的,不同的是,shell編程中,引用一個變數的值要用$符號,但是給這個變數賦值的時候不需要使用$符號,而Perl不同,在Perl中,不管是對變數賦值,還是引用變數的值,都需要用$符號--其實這樣更符合編程習慣。如:
$fred = 17; # give $fred the value of 17
$barney = 'hello'; # give $barney the five-character string 'hello'
$barney = $fred + 3; # give $barney the current value of $fred plus 3 (20)
$barney = $barney * 2; # $barney is now $barney multiplied by 2 (40)
11. Binary Assignment Operators. Perl和C一樣,也支援這樣的寫法:
$fred += 5;
$barney *= 3;
$str .= " "; # 效果就是$str = $str . " ";
$fred **= 3; # $fred = $fred ** 3;
12. Output with print. print這個function在Perl中可用做列印,其實我發現Perl中也可以和C一樣的,用printf來列印東西,完全可以不用print:
print "The answer is ";
print 6 * 7;
print ".\n";
上面的也可以這樣寫,這個時候就發現Perl中的逗號是用在這裡的:
print "The answer is ", 6 * 7, ".\n";
13. 在雙引號的字串中可以直接寫入變數,這樣Perl會用變數的值來代替變數,注意,沒有定義的變數會列印成Null 字元串,而且如果開啟了Perl的 warning的話,Perl會抱怨說我們正在引用未定義的變數。如果我們想print一個$符號,直接用backslash轉義就OK了。
和shell編程中一樣,Perl支援用{}將變數括起來的做法,這樣可以顯式的定義變數是哪個,防止出現混淆:
$what = "brontosaurus steak";
$n = 3;
print "fred ate $n $whats.\n"; # not the steaks, but the value of $whats
print "fred ate $n ${what}s.\n"; # now uses $what
print "fred ate $n $what" . "s.\n"; # another way to do it
print 'fred ate ' . $n . ' ' . $what . "s.\n"; # an especially difficult way
14. Comparision Operators. Perl中用作Number和String的比較操作符是不一樣的,具體看附件1,很詳細,要對兩個字串做比較,要用eq, ne這樣的operator,不能用>, <這些符號。Perl在做字串比較的時候,是一個char一個char比較的,注意:大寫字母比小寫字母要小,因為在ASCII碼錶中,所有的大寫字母是排在小寫字母前面的。15. If control structure. 和C一樣的,不同的是,{}什麼時候都不能省,C中如果if的從句只有一句的話,可以省略{},Perl不行。
-
Code: Select all
-
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";
}
16. Boolean Value. Perl沒有專門的bool類型的資料。Perl判斷bool依靠的是以下三條:
If the value is a number, 0 means false; all other numbers mean true.
If the value is a string, the empty string ('') means false; all other strings mean true.
If the value is another kind of scalar than a number or a string, convert it to a number or a string and try again.[]
要注意的是,字串"0"也表示false,empty string也表示false,這是一個特例。掌握了上面三條,我們就可以在Perl的if中靈活書寫bool條件了。
17. Getting user input. Perl中獲得使用者輸入非常簡單,直接用關鍵字<STDIN>,如下:
-
Code: Select all
-
$line = <STDIN>;
if ($line eq "\n") {
print "That was just a blank line!\n";
} else {
print "That line of input was: $line";
}
如果要從一個檔案中擷取輸入,請參考Chapter 5。另外注意,用這種方式讀進來的字串,末尾會有一個newline(\n),和C一樣的,要去掉行尾的\n,請用chomp
18. chomp. chomp是一個function,用來去掉行尾的\n,如下:
chomp($text = <STDIN>); # Read the text, without the newline character
$text = <STDIN>; # Do the same thing...
chomp($text); # ...but in two steps
一般推薦用第一種寫法,簡潔。也可以這樣寫:chomp $text,Perl中很多時候調用一個function,可以不加括弧,除非某些特殊情況。而且chomp作為一個function,是有return value的,不過chomp的return value一般用不上,他表示chomp去掉了多少個\n,一般這個值就是1。chomp也只會去掉一個\n,如果一行中有多個\n,chomp也只會去 掉一個,如果行中沒有\n,那chomp等於什麼都沒做。
19. The while control structure. 看一段代碼就OK:
-
Code: Select all
-
$count = 0;
while ($count < 10) {
$count += 2;
print "count is now $count\n"; # Gives values 2 4 6 8 10
}
和if一樣,{}在什麼情況下都不能省略。
20. undef value. 前面已經提到過了,如果一個變數沒有賦過值的話,他的值就是undef,如果這是一個Number,那麼,這個undef將被解釋成0,如果是一個 String,那麼這個undef就會被解釋成empty string。有的時候我們可以利用這個特性,直接使用一個變數,大部分情況下,這是沒有什麼問題的。如果我們開啟了Perl的warning功能,那麼 當引用一個undef的variable的時候,Perl會列印warning資訊。
21. defined function. 我們可以使用Perl提供的defined這個function來測試一個變數的值是不是undef(而不是0或者是empty string)。有的時候會有undef的情況出現,比如,當讀入一個檔案的時候,如果讀到了EOF,那麼,變數就會變成undef的值:
-
Code: Select all
-
$madonna = <STDIN>;
if ( defined($madonna) ) {
print "The input was $madonna";
} else {
print "No input available!\n";
}
我們也可以手動給變數賦undef的值,不過這樣做的話,其實就等於什麼都沒做。
$madonna = undef; # As if it had never been touched