標籤:
簡短的perl程式能夠實現大功能。
perl是如何做到的呢?
1. 預設變數
如果沒有向函數提供參數值,則預設參數為$_;
如果沒有變數用於接收一個運算式的值,則預設接收變數為$_。
perl語言每條語句可像管道那樣運行,通過預設變數$_串接起來。
2. 特殊文法
利用一些正常情況下沒有含義的文法,如while(<>){}.
如果按照正常的文法,這個定法的意義是:讀取一行文本,然後丟棄。
由於正常情況下沒有人會這麼用,perl語言將這一文法利用起來了。在實際中寫起來非常方便。
3. 變數值不用給定初值,不用提前聲明
perl會自動為變數選擇合適的初值,如果沒有給定的話。
對於數值,初值為0;對於字串,初值為““,也就是Null 字元串。
4. 對於一些常用文法的簡潔寫法
如通過qw定義一個字串list,可避免寫引號。
簡短的好處?
簡短,再加上perl與shell結合非常好,可以在命令列上直接寫出簡短又功能強大的代碼。
一個常用用法:
find . |perl -e ‘while(<>){...}‘
處理標準輸入的每一行文本。‘...‘表示每行的處理代碼。
通過動態聲明一個函數,省略while,只提供每行的處理代碼,可以進一步節省位元組。
process_each_line.pl
#!/usr/bin/perl my $cmd=$ARGV[0]; my $func = eval "sub{while(<STDIN>){chomp;$cmd;}}"; die "unable to compile ‘$cmd‘, aborting...\n" if not defined $func; $func->();
命令列調用
find . |./process_each_line.pl ‘print if /pl$/‘
列印出目前的目錄下所有以pl結尾的檔案名稱。
process_each_line.pl 會產生一個函數 sub{while (<STDIN>){chomp; print if /pl$/;}}(第3行),然後再調用這個函數(最後一行)。
可繼續擴充這個檔案,加入一些常用函數,供在命令列上直接調用。
簡短的perl程式