#!/usr/bin/perl -w
eval 'exec /usr/bin/perl -w -s $0 $'
if 0; # not running under some shell
當我們不確定perl安裝目錄的時候可以這麼寫
#!/usr/bin/perl -w
eval 「exec perl -w -s $0 $
@」if 0; # not running under some shell
這幾行程式包含了太多的技巧。
的確需要很深的功力才能看得懂。
首先解釋一下,# 打頭的行在 shell 中表示該行是注釋行,但是如果該指令碼具有可執行許可權,
而直接執行(如 c 的 exec* 系列系統呼叫,或者 shell 下直接敲指令碼名稱)的時候,該行
起到指示直譯器的作用。在本例中,指定直譯器是 /usr/bin/perl(假設使用者的系統上已經
安裝了 perl 並且安裝位置就在 /usr/bin/perl 否則該指令碼無論如何都是無法執行的)
當乙個使用者拿到指令碼時,根據個人習慣和知識水平的不同,可能會有以下三種執行指令碼的方法:
執行方式 1,./foo
使用 chmod +x foo 賦予了指令碼可執行許可權之後,就可以用這種方法來執行。
前面說了,這種方式執行的時候,os 會去按照指令碼第一行 #! 的指示去尋找 interpreter
的位置,在這裡也就是 /usr/bin/perl,所以一旦找到 /usr/bin/perl,後面的兩行
eval 'exec /usr/bin/perl ......' if $rrunning_under_some_shell; 就會被當作 perl
**來執行。因為 $running_under_some_shell 這個變數沒有被定義過,因此它的值為
undef,也就是說 if 修飾符會失敗,從而導致 eval 這句不會被執行。因此在這種情況下,
如果系統中已經安裝了 perl 並且 perl 的位置就是在 /usr/bin/perl 的話,這兩行就相當於什麼都沒有
注意在 perl 中換行符作為空白符是可以任意新增的,所以這兩行合起來實際上是乙個完
整的語句。但是這裡面有個技巧,它故意寫成了兩行,原因在下面解釋。
執行方式 2,perl foo
當使用者已經知道這個指令碼是乙個 perl 指令碼的時候,就可以用這種方式執行。這種方式和
第一種方式基本相同,唯一不同的地方就是 #!/usr/bin/perl 會被當成普通的 perl 注釋。
執行方式 3,sh foo
這種方式下,使用者誤以為 foo 是乙個 shell 指令碼,因此呼叫了 shell 來執行這個指令碼。
此時,第一行 #! 會被 shell 當作普通的注釋而忽略。在這種情況下,eval 會被當作乙個
shell 命令來解釋,它的引數 'exec /usr/bin/perl ....' 則是乙個合法的 shell 命令,
其作用就是重新呼叫 /usr/bin/perl 來解釋此指令碼,shell 引數 $0 在這種情況下其實就是
指令碼自身的名稱。而 "$@" 也就等於 "$1" "$2" "$3" ... 也就是指令碼的引數(注)。也就是說:
如果該指令碼被錯誤地當作 shell 指令碼來執行,那也沒問題,因為它也是乙個
合法的 perl 指令碼 注意這裡故意把 if 修飾符另起一行來寫,是為了保證 eval
那行是乙個正確的 shell 語句。因為 eval 那行一旦執行成功,exec 會覆蓋當前程序,
因此 if 這一行根本就沒有執行的機會,也就不會出錯。
總結:這麼寫的作用,是為了讓這個指令碼既能用 perl 來解釋,也能用 shell 來解釋。如果當
用 perl 來解釋,固然正確,但是即使用 shell 來解釋,也不僅不會出錯,還會得到同
樣的結果。
perl之開頭篇
乙個月前接到關於日誌監視的指令碼任務,鑑於公司用的基本都是perl,所以沒做太多考慮就決定用perl寫這個指令碼。由於之前開過一點perl perl學習入門 但一碰到真槍實彈,還真是有點麻煩,邏輯上寫一下還可以,一碰到語法等問題特別是一些shella命令就頭疼,因為之前對shell程式設計不是很熟悉...
Perl注釋格式
一 單行注釋 以 開頭的行都被perl認為是注釋。但是有乙個例外,perl程式的第一行 usr bin perl 也是 開頭的,但它不是注釋,它的作用是指定了perl程式的直譯器。例如 print 1 二 多行注釋 最常用的方法是使用 pod plain old documentations 來進行...
python 開頭,r 開頭, u開頭 解碼
coding utf 8 def dec a x 開頭 解碼 以 或 x 開頭的字串叫做 ncr 字元 通過 py2.x下的htmlparser 或 py3.x下的html 的 unescape 方法來轉換成能看懂的中文字元 aa a.replace replace x u encode utf 8...