一、進程處理函數
1、進程啟動函數
函數名eval調用語法eval(string)解說將string看作Perl語句執行。
正確執行後,系統變量$@為空串,如果有錯誤,$@中為錯誤信息。例子$print = "print (\"hello,world\n\");";
eval ($print);結果輸出hello, world
函數名system調用語法system(list)解說list中第一個元素為程序名,其余為參數。
system啟動一個進程運行程序並等待其結束,程序結束後錯誤代碼左移八位成為返回值。例子@proglist = ("echo", "hello,world!");
system(@proglist);結果輸出hello, world!
函數名fork調用語法procid = fork();解說創建程序的兩個拷貝--父進程和子進程--同時運行。子進程返回零,父進程返回非零值,此值為子程序的進程ID號。例子$retval = fork();
if ($retval == 0) {
# this is the child process
exit; # this terminates the child process
} else {
# this is the parent process
}結果輸出無
函數名pipe調用語法pipe (infile, outfile);解說與fork合用,給父進程和子進程提供通信的方式。送到outfile文件變量的信息可以通過infile文件變量讀取。步驟:
1、調用pipe
2、用fork將程序分成父進程和子進程
3、一個進程關掉infile,另一個關掉outfile例子pipe (INPUT, OUTPUT);
$retval = fork();
if ($retval != 0) {
# this is the parent process
close (INPUT);
print ("Enter a line of input:\n");
$line =
print OUTPUT ($line);
} else {
# this is the child process
close (OUTPUT);
$line = ;
print ($line);
exit (0);
}
program
Enter a line of input:
Here is a test line
Here is a test line
$
函數名exec調用語法exec (list);解說與system類似,區別是啟動新進程前結束當前程序。常與fork合用,當fork分成兩個進程後,子進程用exec啟動另一個程序。例子
結果輸出
函數名syscall調用語法syscall (list);解說調用系統函數,list第一個元素是系統調用名,其余為參數。
如果參數是數字,就轉化成C的整型數(type int)。否則傳遞字符串的指針。詳見UNIX的幫助或Perl文檔。
使用syscall必須包含文件syscall.pl,即:
require ("syscall.ph"); 例子
結果輸出
函數名die調用語法die (message);解說終止程序並向STDERR輸出錯誤信息。message可以為字符串或列表。如果最後一個參數不包含換行符,則程序文件名和行號也被輸出。例子die ("Cannot open input file");結果輸出Cannot open input file at myprog line 6.
函數名warn調用語法warn (message);解說與die類似,區別是不終止程序。例子warn("Danger! Danger!\n");結果輸出Danger! Danger!
函數名exit調用語法exit (retcode);解說終止程序並指定返回值。例子exit(2);結果輸出無
函數名kill調用語法kill (signal, proclist);解說給一組進程發送信號。
signal是發送的數字信號,9為殺掉進程。
proclist是進程ID列表。詳見kill的UNIX幫助。例子
結果輸出
函數名sleep調用語法sleep (time);解說將程序暫停一段時間。time是停止的秒數。返回值為實際停止的秒數。例子sleep (5);結果輸出無
函數名wait調用語法procid = wait();解說暫停程序執行,等待子進程終止。
不需要參數,返回值為子進程ID,如果沒有子進程,返回-1。例子
結果輸出
函數名waitpid調用語法waitpid (procid, waitflag);解說暫停程序執行,等待特定的子進程終止。procid為等待的進程ID例子$procid = fork();
if ($procid == 0) {
# this is the child process
print ("this line is printed first\n");
exit(0);
} else {
# this is the parent process
waitpid ($procid, 0);
print ("this line is printed last\n");
}結果輸出$ program
this line is printed first
this line is printed last
$
函數名caller調用語法subinfo = caller();解說返回調用者的程序名和行號,用於Perl Debugger。
返回值為三元素的列表:
1、調用處的包名
2、調用者文件名
3、調用處的行號例子
結果輸出
函數名chroot調用語法chroot (dir);解說改變程序的根目錄,詳見chroot幫助。例子
結果輸出
函數名local調用語法local($variable);解說在語句塊(由大括號包圍的語句集合)中定義局域變量,僅在此語句塊中起作用,對其的改變不對塊外同名變量造成影響。
千萬不要在循環中使用,否則每次循環都定義一個新的局域變量!例子
結果輸出
函數名times調用語法timelist = times解說返回該程序及所有子進程消耗的工作時間。
返回值為四個浮點數的列表:
1、程序耗用的用戶時間
2、程序耗用的系統時間
3、子進程耗用的用戶時間
4、子進程耗用的系統時間例子
結果輸出
函數名sin調用語法retval = sin (value);解說參數為弧度值。
函數名cos調用語法retval = cos (value);解說參數為弧度值。
函數名atan2調用語法retval = atan2 (value1, value2);解說運算並返回value1除以value2結果的arctan值,單位為弧度,范圍在-PI~PI。應用例:
角度轉化成弧度子程序。sub degrees_to_radians {
local ($degrees) = @_;
local ($radians);11:
$radians = atan2(1,1) * $degrees / 45;
}
函數名sqrt調用語法retval = sqrt (value);解說平方根函數。value為非負數。
函數名exp調用語法retval = exp (value);解說返回e的value次方。
函數名log調用語法retval = log (value);解說以e為底的自然對數。
函數名abs調用語法retval = abs (value);解說絕對值函數。(Perl 4中沒有)
函數名rand調用語法retval = rand (num);解說隨機數函數,返回0和整數num之間的一個浮點數。
函數名srand調用語法srand (value);解說初始化隨機數生成器。保證每次調用rand真正隨機。
三、字符串處理函數函數名index調用語法position = index (string, substring, position);解說返回子串substring在字符串string中的位置,如果不存在則返回-1。參數position是可選項,表示匹配之前跳過的字符數,或者說從該位置開始匹配。
函數名rindex調用語法position = rindex (string, substring, position);解說與index類似,區別是從右端匹配。
函數名length調用語法num = length (string);解說返回字符串長度,或者說含有字符的數目。
函數名pos調用語法offset = pos(string);解說返回最後一次模式匹配的位置。
函數名substr調用語法substr (expr, skipchars, length)解說抽取字符串(或表達式生成的字符串)expr中的子串,跳過skipchars個字符,或者說從位置skipchars開始抽取子串(第一個字符位置為0),子串長度為length,此參數可忽略,意味著取剩下的全部字符。
當此函數出現在等式左邊時,expr必須為變量或數組元素,此時其中部分子串被等式右邊的值替換。
函數名study調用語法study (scalar);解說用一種內部格式提高變量的訪問速度,同一時刻只對一個變量起作用。
函數名lc
uc調用語法retval = lc(string);
retval = uc(string);解說將字符串全部轉換成小/大寫字母。
函數名lcfirst
ucfirst調用語法retval = lcfirst(string);
retval = ucfirst(string);解說將第一個字母轉換成小/大寫。
函數名quotameta調用語法newstring = quotemeta(oldstring);解說將非單詞的字母前面加上反斜線(\)。
語句 : $string = quotemeta($string);
等效於:$string =~ s/(\W)/\/g;
常用於模式匹配操作中,確保字符串中沒有字符被看作匹配操作符。
函數名join調用語法join (joinstr, list);解說把字符串列表(數組)組合成一個長的字符串,在每兩個列表元素間插入串joinstr。
函數名sprintf調用語法sprintf (string, fields);解說與printf類似,區別是結果不輸出到文件,而作為返回值賦給變量。例子$num = 26;
$outstr = sprintf("%d = %x hexadecimal or %o octal\n",$num, $num, $num);
print ($outstr);結果輸出26 = 1a hexadecimal or 32 octal
函數名chop調用語法$lastchar = chop (var);解說var可為變量或數組,當var為變量時,最後一個字符被刪除並賦給$lastchar,當var為數組/列表時,所有元素的最後一個字符被刪除,最後一個元素的最後一個字母賦給$lastchar。
函數名chomp調用語法result = chomp(var);解說檢查字符串或字符串列表中元素的最後一個字符是否為由系統變量$/定義的行分隔符,如果是就刪除。返回值為實際刪除的字符個數。
函數名crypt調用語法result = crypt (original, salt);解說用DES算法加密字符串,original是將要加密的字符串,salt是兩個字符的字符串,定義如何改變DES算法,以使更難解碼。返回值為加密後的串。
函數名hex調用語法decnum = hex (hexnum);解說將十六進制數(字符串形式)轉化為十進制數。
函數名int調用語法intnum = int (floatnum);解說將浮點數捨去小數部分轉化為整型數。
函數名oct調用語法decnum = oct (octnum);解說將八進制數(字符串形式)或十六進制數("0x.."形式)轉化為十進制數。
函數名ord調用語法asciival = ord (char);解說返回單個字符的ASCII值,與PASCAL中同名函數類似。
函數名chr調用語法$char = chr (asciival);解說返回ASCII值的相應字符,與PASCAL中同名函數類似。
函數名pack調用語法formatstr = pack(packformat, list);解說把一個列表或數組以在實際機器存貯格式或C等編程語言使用的格式轉化(包裝)到一個簡單變量中。參數packformat包含一個或多個格式字符,列表中每個元素對應一個,各格式字符間可用空格或tab隔開,因為pack忽略空格。
除了格式a、A和@外,重復使用一種格式多次可在其後加個整數,如:
$twoints = pack ("i2", 103, 241);
把同一格式應用於所有的元素則加個*號,如:
$manyints = pack ("i*", 14, 26, 11, 83);
對於a和A而言,其後的整數表示要創建的字符串長度,重復方法如下:
$strings = pack ("a6" x 2, "test1", "test2");
格式@的情況比較特殊,其後必須加個整數,該數表示字符串必須的長度,如果長度不夠,則用空字符(null)補足,如:
$output = pack ("a @6 a", "test", "test2");
pack函數最常見的用途是創建可與C程序交互的數據,例如C語言中字符串均以空字符(null)結尾,創建這樣的數據可以這樣做:
$Cstring = pack ("ax", $mystring);
下表是一些格式字符與C中數據類型的等價關系:
格式字符 描述a用空字符(null)補足的字符串A用空格補足的字符串b位串,低位在前B位串,高位在前c帶符號字符(通常-128~127)C無符號字符(通常8位)d雙精度浮點數f單精度浮點數h十六進制數串,低位在前H十六進制數串,高位在前i帶符號整數I無符號整數l帶符號長整數L無符號長整數n網絡序短整數N網絡序長整數p字符串指針s帶符號短整數S無符號短整數u轉化成uuencode格式vVAX序短整數VVAX序長整數x一個空字節X回退一個字節@以空字節(null)填充
函數名unpack調用語法@list = unpack (packformat, formatstr);解說unpack與pack功能相反,將以機器格式存貯的值轉化成Perl中值的列表。其格式字符與pack基本相同(即上表),不同的有:A格式將機器格式字符串轉化為Perl字符串並去掉尾部所有空格或空字符;x為跳過一個字節;@為跳過一些字節到指定的位置,如@4為跳過4個字節。下面看一個@和X合同的例子: $longrightint = unpack ("@* X4 L", $packstring);
此語句將最後四個字節看作無符號長整數進行轉化。下面看一個對uuencode文件解碼的例子:
1 : #!/usr/local/bin/perl當將pack和unpack用於uuencode時,要記住,雖然它們與UNIX中的uuencode、uudecode工具算法相同,但並不提供首行和末行,如果想用uudecode對由pack的輸出創建的文件進行解碼,必須也把首行和末行輸出(詳見UNIX中uuencode幫助)。
2 :
3 : open (CODEDFILE, "/u/janedoe/codefile") ||
4 : die ("Can't open input file");
5 : open (OUTFILE, ">outfile") ||
6 : die ("Can't open output file");
7 : while ($line =) {
8 : $decoded = unpack("u", $line);
9 : print OUTFILE ($decoded);
10: }
11: close (OUTFILE);
12: close (CODEDFILE);
函數名vec調用語法retval = vec (vector, index, bits);解說顧名思義,vec即矢量(vector)函數,它把簡單變量vector的值看作多塊(維)數據,每塊含一定數目的位,合起來即一個矢量數據。每次的調用訪問其中一塊數據,可以讀取,也可以寫入。參數index就象數組下標一樣,提出訪問哪一塊,0為第一塊,依次類推,要注意的是訪問次序是從右到左的,即第一塊在最右邊。參數bits指定每塊中的位數,可以為1,2,4,8,16或32。例子1 : #!/usr/local/bin/perl
2 :
3 : $vector = pack ("B*", "11010011");
4 : $val1 = vec ($vector, 0, 4);
5 : $val2 = vec ($vector, 1, 4);
6 : print ("high-to-low order values: $val1 and $val2\n");
7 : $vector = pack ("b*", "11010011");
8 : $val1 = vec ($vector, 0, 4);
9 : $val2 = vec ($vector, 1, 4);
10: print ("low-to-high order values: $val1 and $val2\n"); 結果high-to-low order values: 3 and 13
low-to-high order values: 11 and 12
函數名defined調用語法retval = defined (expr);解說判斷一個變量、數組或數組的一個元素是否已經被賦值。expr為變量名、數組名或一個數組元素。
如果已定義,返回真,否則返回假。
函數名undef調用語法retval = undef (expr);解說取消變量、數組或數組元素甚至子程序的定義,回收其空間。返回值始終為未定義值,此值與空串等效。
五、數組和列表函數函數名grep調用語法@foundlist = grep (pattern, @searchlist);解說與同名的UNIX查找工具類似,grep函數在列表中抽取與指定模式匹配的元素,參數pattern為欲查找的模式,返回值是匹配元素的列表。例子@list = ("This", "is", "a", "test");
@foundlist = grep(/^[tT]/, @list);結果@foundlist = ("This", "test");
函數名splice調用語法@retval = splice (@array, slipelements, length, @newlist);解說 拼接函數可以向列表(數組)中間插入元素、刪除子列表或替換子列表。參數skipelements是拼接前跳過的元素數目,length是被替換的元素數,newlist是將要拼接進來的列表。當newlist的長度大於length時,後面的元素自動後移,反之則向前縮進。因此,當length=0時,就相當於向列表中插入元素,而形如語句
splice (@array, -1, 0, "Hello");
則向數組末尾添加元素。而當newlist為空時就相當於刪除子列表,這時,如果length為空,就從第skipelements個元素後全部刪除,而刪除最後一個元素則為:splice (@array, -1);這種情況下,返回值為被刪去的元素列表。
函數名shift調用語法element = shift (@arrayvar);解說刪去數組第一個元素,剩下元素前移,返回被刪去的元素。不加參數時,缺省地對@ARGV進行操作。
函數名unshift調用語法count = unshift (@arrayver, elements);解說作用與shift相反,在數組arrayvar開頭增加一個或多個元素,返回值為結果(列表)的長度。等價於splice (@array, 0, 0, elements);
函數名push調用語法push (@arrayvar, elements);解說在數組末尾增加一個或多個元素。等價於slice (@array, @array, 0, elements);
函數名pop調用語法element = pop (@arrayvar);解說與push作用相反,刪去列表最後一個元素,並將其作為返回值,當列表已空,則返回“未定義值”(即空串)。
函數名split調用語法@list = split (pattern, string, maxlength);解說將字符串分割成一組元素的列表。每匹配一次pattern,就開始一個新元素,但pattern本身不包含在元素中。maxlength是可選項,當指定它時,達到該長度就不再分割。
函數名sort調用語法@sorted = sort (@list);解說按字母次序給列表排序。
函數名reverse調用語法@reversed = reverse (@list);解說按字母反序給列表排序。
函數名map調用語法@resultlist = map (expr, @list);解說此函數在Perl5中定義,可以把列表中的各個元素作為表達式expr的操作數進行運算,其本身不改變,結果作為返回值。在表達式expr中,系統變量$_代表各個元素。例子1、@list = (100, 200, 300);
@results = map ($_+1, @list);
2、@results = map (&mysub($_), @list);結果1、(101, 201, 301)
2、無
函數名wantarray調用語法result = wantarray();解說Perl中,一些內置函數的行為根據其處理簡單變量還是數組有所不同,如chop。自定義的子程序也可以定義這樣兩種行為。當子程序被期望返回列表時,此函數返回值為非零值(真),否則為零值(假)。例子1 : #!/usr/local/bin/perl
2 :
3 : @array = &mysub();
4 : $scalar = &mysub();
5 :
6 : sub mysub {
7 : if (wantarray()) {
8 : print ("true\n");
9 : } else {
10: print ("false\n");
11: }
12: } 結果$program
true
false
$
函數名keys調用語法@list = keys (%assoc_array);解說返回關聯數組無序的下標列表。
函數名values調用語法@list = values (%assoc_array);解說返回關聯數組無序的值列表。
函數名each調用語法@pair = each (%assoc_array);解說返回兩個元素的列表--鍵值對(即下標和相應的值),同樣無序。當關聯數組已空,則返回空列表。
函數名delete調用語法element = delete (assoc_array_item);解說刪除關聯數組中的元素,並將其值作為返回值。例子%array = ("foo", 26, "bar", 17");
$retval = delete ($array);結果$retval = 26;