perl學習之路2
這些主要是從 "小駱駝" 書上粘貼或者摘抄出來的, 個人認為需要記的語法知識
"在某些情況下, 你可能需要在一臺機器上寫程序, 再傳送到另一臺機器上運行.這時候, 請使用"文本模式(text mode)" 或者"ASCII模式(ASCIImode)". 記住, 千萬不能是"二進制模式(binary mode)"即便是文本文件, 不同的系統對待換行符的方式也有所不同, 所以碰到無法理解的換行符,某些老舊的Perl還可能中斷運行"
"一般來說, 程序可以以任何文件名保存.Perl程序并不需要用什么特殊的文件名或者擴展名命名,甚至能不用擴展名就最好保護用擴展名 "
"linux上應該修改文件屬性使之變成可執行的 chmod a+x XXX(文件名)"
"有些函數需要寫上版本號, 如下:
#!/usr/bin/perl
use 5.018 #這是我目前的版本 版本號后面必須是3位小數
say "Hello World"; #這時候say函數就能用了"
" # <-這個符號是注釋符號, perl中沒有塊注釋"
"在Unix系統里, 如果文本文件開頭的最前面兩個字符時#!, 那么最后跟著的就是用來執行這個文件的程序路徑, 在windows上沒用,在linux上需要說明。在windows上寫了,也是可以的."
"Perl程序并不需要變量聲明的部分"
"直接量是指某個數字在Perl源代碼中的寫法, 直接量并非運算結果, 也并不是I/O操作的結果,它只是直接鍵入程序源代碼中的數據"
"在Perl內部,則總是按"雙精度浮點數"的要求來保存數字并進行運算的,也就是說,Perl內部并不存在整數值---程序中用到的整形常亮會被轉換成等效的浮點數值"
"perl允許用戶在直接量中插入下劃線"_" 如 61285158231521你可能讀著很費勁 但是你可以這么寫612_8515_8231_521 這兩種寫法都表示同一種數字 "
"Perl中同樣可以使用八進制、十六進制來表示整型常量,除了八、十六進制外,還有二進制,八進制的常量使用0(零)開頭,十六進制以0x開頭,二進制以0b開頭,例如:
- 0377
- 0xFF
- 0b11111111
"
"2**3表示2的3次方 = 8, 取模操作符先取整然后再求余,所以10.5%3.2和10%3的計算結果是一樣的"
"字符串就是一個字符序列, 最短的字符串不包括任何字符串是個空串, 最長的字符串沒有任何限制, 可以填滿整個內存"
"和c or c++不同, 空字符NULL在Perl里并沒有什么特殊的意義, Perl會另行記住字符串的長度, 而不是用空字符串來表示字符串的結尾"
"Perl完全支持Unicode,但是它不會自動將程序源代碼當做Unicode編碼的文本文件讀入, 所以如果你想要在源代碼中使用Unicode書寫直接量的話, 得手工加上utf8編譯指令 use utf8 (這是個好習慣)"
"單引號內的字符串直接量指的是一對單引號圈引的一串字符, 前后兩個單引號并不屬于字符串的內容, 它們只是用來讓Perl識別字符串的開頭與結尾, 除了單引號和反斜線字符外, 單引號內所有字符都代表他們自己, 要表示反斜線字符本身, 需要在這個反斜線字符前再加一個反斜線字符表示轉義, 表示單引號本身也要轉義, 如下
'hello\n' #這里不表示換行 表示hello后面接著反斜線和字母n
'hello
there' #這里hello 換行符 there 總共11個字符 (換行了)
'\'\\' #單引號緊接著反斜線總共2個字符
"
"對于雙引號字符串常量同單引號字符串常量唯一不同的是可以使用轉義字符,例如前面的\n在雙引號字符串常量中表示換行符。轉義字符如下:
- \n 換行
- \r 回車
- \t 水平制表符
- \f 換頁符
- \b 退格
- \a 響鈴
- \e ESC
- \007 八進制的ASCII值,這里的007表示系統響鈴
- \x7f 十六進制的ASCII值,這里的7f表示刪除(DEL)鍵
- \cC 控制符,這里表示(Ctrl + C)
- \\ 反斜線
- \" 雙引號
- \l 將下一個字符轉換為小寫
- \L 將到\E為止的所有字符轉換為小寫
- \u 將下個字符轉換為大寫
- \U 將到\E為止的所有字符轉換為大寫
- \Q 將到\E為止的非單詞(non-word)字符加上反斜線
- \E \E、\U和\Q的結束符
"
"在Perl中可以用 . 來連接兩個字符串 如 "hello" . ' ' . "World!" # 等同于"Hello World!" "
" 還有個特性就是字符串重復操作符,例如:"fred" x 3 # 得到"fredfredfred" ""在Perl中,Perl會根據需要在字符串和數字之間進行類型轉換,轉換的規則取決于操作符,如果操作符的對象是數字,那么Perl就會將它當作數字,如果操作符的對象是字符串時,則將它當作字符串,例如,"12" * "3"的結果為36,"12fred34" * "3"的結果也為36,Perl會忽略其中的非數字部分,特殊情況下不包含數字的字符串會被轉換為零("fred"會被當作數字零來使用)。同樣,在需要字符串的時候,數字會被轉換為字符串來使用,"Z" . 5 * 7等同于"z" . 35得"Z35"。這些轉換都是自動完成的,在平時編程注意一下就是了。"
"開啟警告功能 use warnings, 也可以在命令行上使用-w選項對要運行的程序開啟警告功能 perl -w xxx"
"如果看不懂某個警告信息, 可以利用diagnostics這個編譯命令報告更為詳盡的問題描述, 在perldiag文檔中列有簡要警告信息和詳細診斷說明, 改文檔是理解diagnosticd輸出信息的最佳參考 use diagnostics"
"變量, 就是存儲一個或者多個值得容器的名稱, 而標量變量, 就是單單存儲一個值得變量"
"標量變量存儲的是單個標量值, 標量變量的名稱以美元符號開頭, 這個符號也稱為魔符, 然后是變量的Perl標識符:由一個字母或者下劃線開頭, 區分大小寫, 不限于ASCII字符為變量 如 $name $的意思是"取單個東西"或者"取標量" "
"Perl里面我們可以用一對花括號將變量名圍起來以避免歧義, 如 print "fred ate $n ${what}s.\n" "
"數值與字符串的比較操作符
比較 數字 字符串
相等 == eq
不等 != ne
小于 < lt
大于 > gt
小于等于 <= le
大于等于 >= ge
"
"字符串'0'跟數字0是同一個標量值, 所以Perl會將他們一視同仁, 也就是說, 字符串'0'是唯一被當成假的非空字符串"
獲取用戶輸入
只要把<STDIN>放在程序中希望返回標量值得位置上, Perl就會從標準輸入讀取一行文本.
由<STDIN>返回的字符串一般在末尾都會帶有換行符, 所以通過下面這段代碼, 我們可以看到實際發生的情況:
$line = <STDIN>;
if($line eq "\n")
{
print "that was just a blank line!\n";
}else
{print "that line of input was : $line";}
不過實際編寫代碼時, 很少需要保留末尾換行符, 所以人們常常會用chomp()操作符去掉它
chomp()最常見的用法就是連用: 如:
chomp($text = <STDIN>); #讀入文字, 略過最后的換行符
$text = <STDIN>; #做上面語句同樣的事
chomp($text); #卻分成兩步
chomp()本質是函數, 而作為一個函數, 它就有自己的返回值. chomp()函數的返回值是實際移除的字符串. 這個數字幾乎沒有用處, 如果字符串后面有兩個以上的換行符, chomp()僅僅刪除已個; 如果結尾處沒有換行符, 它什么也不做, 直接返回零.
undef值
如果還沒賦值就用到了某個標量變量, 不會發生什么大不了的事, 也絕對不會讓程序終止運行. 在首次賦值前, 變量的初始值就是特殊的undef值, 它在Perl里的意思僅僅是: 這里空無一物, 如果你想把這個"空無一物"當成數字使用, 他就會表現的像零, 若果當成字符串使用, 他就會表現的像空字符串, 但undef既不是數字也不是zfc, 他完全是另一種類型的標量值
當讀到文件結尾時, 他就會返回undef來表示這個狀況
defined函數
要判斷某個字符串是undef而不是空字符串, 可以使用defined函數, 如果是undef, 該函數返回假, 否則返回真:
$madonna = <STDIN>
if(defined($madonna) )
{
print "the input was $madonna";
}else
{
print "No input available!\n";
}
這里出現了一個問題:
代碼如下:
1 #! /usr/bin/perl 2 3 chomp($madonne = <STDIN>); 4 if(defined($madonne) ) 5 { 6 print "中文$madonne\n"; 7 }else 8 { 9 print "NULL"; 10 }
代碼很簡單但是有個問題,在window環境下cmd是默認是gbk編碼,所以悲催的事來了,假如說我輸入的是中文字符串那么。。。

如圖所示,出現亂碼了。。于是 在代碼中添加了一行 use utf8;于是 仍然顯示亂碼

在百度google以后。。。找到了這么一篇資料
http://blog.useasp.net/archive/2012/04/24/how_to_use_UTF8_encoding_in_Windows_CMD.aspx
結果 沒!有!辦!法!輸!入!中!文! 程序里面的字符串倒是顯示正常

現在真心不知道怎么辦了。。。。
唉
浙公網安備 33010602011771號