perl腳本中defined,exists和delete關鍵字的用法和區別


       剛學習perl腳本的時候,喜歡頻繁使用defined關鍵字判斷一個hash中某個key是否存在,后來程序出了問題才去perl官方文檔查看關於defined關鍵字的准確使用方法。因此,這里我把perl中幾個關鍵字的用法和區別加以介紹,希望大家能夠有所借鑒。

defined()和exists():

       在perl腳本中,undef是一個非常特殊的整數,這個整數用來表示失敗、系統錯誤、文件末尾、未初始化的變量以及其他一系列的異常情況。了解了undef這個變量,那么就可以來看defined變量的作用了。當defined子程序的參數是一個變量的時候,作用非常的簡單,就是用來判斷這個變量是否為undef.怎么樣,defined函數的目的很單純吧?哈哈。可是,如果用一個簡單的布爾判斷去判斷一個變量,與用defined去判斷一個變量有什么區別呢?原來,在進行簡單的bool判斷的時候,perl解釋器並不區分undef,空字符串,數字0以及字符串“0”,也就是說,以下子程序任何總是輸出"not ok",無論$a的值是undef ,空字符串或者數字0或者字符串0;注意,undef在perl中僅僅是一個整數,他所被賦予的特殊含義(比如失敗,文件末尾,系統錯誤等)只是出於習慣。所以,undef並不一定表示系統出現異常。比如,perl中pop操作在兩種情況下會返回異常:1,被彈出的數組已經為空 2:被彈出的這個元素不是別人,正好是undef。

      defined函數以聚合性變量(如數組和哈希)作為參數的習慣已經被新版本的perl廢棄。舊版本的perl使用這種形式來判斷數據或者哈希是否已經被分配內存。新版本的perl中,我們完全可以用perl的scalar函數的返回值來進行判斷。但是我們經常可以看到defined函數的參數是哈希的某個元素,如,defined($hash{$key}),這種情況下的用法需要引起特別注意,它是告訴我們這個$key對應的值是否定義,而不是這個$key是否存在(即如果這個key存在,但是它對應的value未定義,那么defined返回false而exists依然返回true。當然,如果這個key不存在,exists和defined同樣都返回false)。一般,如果要判斷這個key是否存在,我們使用exist函數,因為exists函數與這個key對應的value是否定義無關。

 

if($a){
print "ok";
}
else{
print "not ok.";
}

 

delete():

      在功能上,delete與exists幾乎完美對應。它將對應哈希表中的key和value一並刪除。此時exists將會返回false.這與將一個哈希表的某個key對應的value設置為undef不一樣。最重要也是最奇怪的一點,如果所刪除的不是該數組的最后一個元素,那么delete操作竟然不會改變該array的size,也就是說,delete前后,用scalar函數檢測該array,得到是相同的結果。而且用foreach遍歷輸出該array,發現該array對應的被刪除的位置依然存在,只不過該位置已經沒有任何值了。如果刪除的是array的最后一個值 ,那么該array的size會對應減小,而且該值的占位也被刪除了,此時的效果與shift()完全相同。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM