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