寒假期間看了一本關于Perl的入門書籍,感覺不錯,下面是一些讀書筆記:
你將看到整數(如255,2001 等)和浮點數(有小數點的實數,如3.14159,1.35x1025),但在內部,Perl 都把它們當作雙精度浮點數來處理
61298040283768,Perl 允許用下劃線來分隔它,因此可以像下面這樣書寫:61_298_040_283_768
和C,C++不同,Perl 中NUL 字符沒有特殊的含義。Perl 能計算長度,不用靠null 來判斷字符串是否結束。
單引號字符串中的\n 不會被當作換行符來處理,其僅僅是兩個字符\和n。只有在反斜線(\)后面接的是\或單引號’,其才會被當作特殊符號來處理。
一個特殊的操作符是字符串重復操作符(string repetition operator),由小寫的字母x 表示。
“fred”x 3 #“fredfredfred”
“barney”x (4+1) # “barney”x 5, “barneybarneybarneybarneybarney”
5 x 4 #實際上是“5”x 4, “5555”
標量變量在Perl 中由$開頭
列表和數組可以包含任意數量的元素。最少含有0 元素,最多可以填滿你的可用內存。這里又體現了Perl 的設計哲學,“沒有不必要的限制”。
rocks 數組,其最后一個元素的索引為$#rocks
Larry 提供了一種簡便方法:數組的負數索引值從最后一個元素開始
負數索引值是-1表示最后一個元素
一個給定的表達式在不同的上下文中其含義是不同的。
$fred = something; # 標量context
@pebbles = something; #列表context
($wilma,$betty) = something; #列表context
($dino) = something; #列表context
當Perl 遍歷此子程序時,將會計算每一步的值。此子程序中最后計算的值將被返回。
這是Unix中很少人知道的一個事實:如許多標準的工具,如cat,sed,也使用這種約定,連接號(-)代表標準輸入流。
技術上講,<>從數組@ARGV 中得到調用參數。
printf“The items are:\n”. (“%10s\n”x @items), @items;
程序的名字在Perl 的特殊變量$0 中
只有Perl 成功的重新打開新的連接,否則是不會關閉以前的連接。
要引用整個hash,使用百分號(“%”)作為前綴
使用delete 后,hash 中將不會存在此key;如果其值是udnef,則key 是存在的。
不要將正則表達式和shell 中的文件名匹配模式,globs 混淆了.
Perl 中,注釋可以被作為空白
使用綁定操作符(=~)將告訴Perl 將右邊的模式在左邊的字符串上進行匹配,而非對$_匹配。
@fields = split /:/,“abc:def::g:h”; #得到(“abc”, “def”, “”, “g”, “h”)
這里有一條規則:開頭的空元素會被返回,但結尾的空元素被丟棄
@fields = split /:/, “:::a:b:c:::”; #得到(“”, “”, “”, “a”, “b”, “c”);
默認時,split 對$_操作,模式為空白:
my @fields = split; #同split /\s+/, $_;
如果沒有指定文件名,則其從標準輸入流中自動打開和關閉一系列文件進行讀入。如果$^I中有字符串,這個字符串則會成為備份文件的擴展名。
?號在正則表達式中的第四種用法:問號,表示0 或1 的數量詞,非貪婪修飾符,現在是開頭符
條件表達式也是先被求值的,雖然被放在后面
last 會立刻結束循環。(這同C 語言或其它語言中的“break”語句類似)
可以使用last 從“裸的”代碼塊中跳出。
next 之后,又會進入下一輪循環(這和C 或者類似語言的“continue”相似)
redo會調到當前循環塊的頂端,不進行條件表達式判斷以及接著本次循環。
標簽在整塊之前使用;不是針對代碼中的某些點
-T和-B分別檢測一個文件是文本的還是二進制,那Perl是怎樣知道的呢?答案是Perl欺騙了我們:它打開一個文件,查看前面幾千個字節,進行合理的猜測。如果沒有太多的怪異符號,則其像文本
每當在程序中使用stat, lstat,或文件檢測(file test)時,Perl 就會要求系統分配一塊stat buffer給文件(也就是,stat系統調用所返回的buffer)。這就意味著如果想知道文件是否是可讀且可寫的,需要對相同的信息進行兩次系統調用
這暗示了一個目錄的連接數等于2 (.和..)加上其包含的子目錄的個數。
在Perl 中,環境變量可以通過%ENV 這個hash 變量得到
對于system和exec,其輸出的結果傳到Perl標準輸出的地方。有時,將其結果作為字符串保留下來以便進一步處理是很有趣的。這可以通過使用反引號(`)而非單引號或者雙引號做到
Perl 提供了處理嚴重錯誤的方法:將這些代碼放入eval 塊中
eval 是一個表達式(不是像while 或foreach 那樣的控制結構),因此結尾處的分號是必須的。
如果eval 捕捉到了嚴重錯誤,則返回值為undef 或空列表,依賴于其context
如果將列表的一個元素被賦給undef,則意味著忽略此元素:
my(undef, $card_num, undef, undef, undef, $count) = split /:/;
同array slice一樣,(hash slice)變量前的符號($或@符號)決定了下標表達式的context。如果前面是$符號,則下標表達式是在標量context 中被求值,得到一個值◆。如果之前為@符號,則下標表達式在列表context 中被求值,得到一列值。