Perl中的alarm eval die的聯合使用

2021-08-07 07:31:40 字數 1371 閱讀 2652

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...