1. eval:
eval是乙個表示式,而不是if和while這樣的控制結構,eval塊發生嚴重錯誤時,eval塊會停止執行,但程式不會崩潰。所以在程式中執行有可能引起嚴重錯誤的**塊,但又不想影響後續程式的執行時,可以把這部分**塊放入eval中。eva塊正常執行,還是發生了嚴重錯誤,放在$@中,如果沒錯,$@為空,否則存放錯誤的原因。可以用$@的boolean值判斷結果:print $@ if $@.
有四種型別的錯誤,eval不能捕捉,例如記憶體不足等系統錯誤,perl都沒法跑起來。
想退出eval**塊,用的是die,而不是exit;
2. alarm:
alarm exp;
alarm;
如果exp被忽略,則用$ _的值來代替。實際的時間延遲是不準確的,因為不同的系統實現了不同的報警功能。實際時間可能是可達的第二或小於所請求的值。 在任何乙個時間內只能設定乙個鬧鐘定時器。
eg1:
$timeout=5;
eval = sub ; #設定超時時的處理函式
alarm $timeout;
sleep 10;
print "in alarm eval\n";
alarm (0); #程式執行完成,取消前面的超時處理,並且不會開啟乙個新的超時操作。
};print "out of alarm eval\n";
if ($@)
else
}output:
# perl test.pl
out of alarm eval
after 5 second,run alarm
解析:因為在eval塊中,設定了alarm 5;之後,執行後面的**塊,5s後已經超時了,程式還只執行在sleep 5,所以eval裡面的print未執行;
如果將sleep 10換成sleep 2:
# perl test.pl
in alarm eval
out of alarm eval
所以如果alarm $timeout和alarm 0之間的**執行時間超過了$timeout,就會die,退出eval;
eg2:
$sig = sub ;
alarm 20;
system("firefox");
alarm 0;
解析:在執行這段**的時候,firefox最後並沒有被kill掉,那是因為alarm 20和alarm0之間的**執行時間沒有超過20s,然後alarm 0已經取消了超時操作。
如果想在20s後,kill掉firefox,可以如下:
$sig = sub ;
alarm 20;
system("firefox");
sleep 21;
alarm 0;
perl 1 perl中的數字
下面是在perl中的要點記錄 1 在perl中只有雙精度浮點數,也就是我們常說的double。在perl中我們看到的整數和浮點數,只是我們看的樣子和形式不同而已,其實在perl的內部它全部作為雙精度浮點數來運算。2 浮點數可以以十進位制的指數來記,符號是 e 並不區分大小寫,如 1.2e20,1.2...
perl 中的引用
perl 語言中的引用共分為兩類 宣告引用時只需要在物件的前面加上反斜槓 第一列是陣列的引用 示例 my array 1,2,3 my array ref array 第二種是雜湊的引用 示例 my hash 1,2,3,4 my hash ref hash 通過引用去訪問對應的值,通過 操作符 陣...
perl中的執行緒
1 直接執行子程式,按順序由上到下執行 乙個執行緒內執行 sub test0 test0 print main 0 n print main 1 n 結果 test0 0 test0 1 finish test0 main 0 main 1 2 用create建立執行緒後的執行過程 use thre...