日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關咨詢
選擇下列產品馬上在線溝通
服務時間:8:30-17:00
你可能遇到了下面的問題
關閉右側工具欄

新聞中心

這里有您想知道的互聯(lián)網營銷解決方案
深入學習Perl文件系統(tǒng)用法

 本文和大家重點討論一下Perl文件系統(tǒng)的概念,本文所講的函數(shù)多數(shù)使用了UNIX操作系統(tǒng)的特性,在非UNIX系統(tǒng)中,一些函數(shù)可能沒有定義或有不同的工作方式,使用時請查看Perl聯(lián)機文檔。

自貢網站建設公司成都創(chuàng)新互聯(lián),自貢網站設計制作,有大型網站制作公司豐富經驗。已為自貢近1000家提供企業(yè)網站建設服務。企業(yè)網站搭建\成都外貿網站建設公司要多少錢,請找那個售后服務好的自貢做網站的公司定做!

 Perl文件系統(tǒng)

本文所講的函數(shù)多數(shù)使用了UNIX操作系統(tǒng)的特性,在非UNIX系統(tǒng)中,一些函數(shù)可能沒有定義或有不同的工作方式,使用時請查看Perl聯(lián)機文檔。

一、Perl文件輸入/輸出函數(shù)

本節(jié)講述從Perl文件中讀取信息和向Perl文件寫入信息的內置庫函數(shù)。

1、基本I/O函數(shù)

一些I/O函數(shù)在前面的章節(jié)中已有講述,如

open:允許程序訪問Perl文件
close:終止Perl文件訪問
print:Perl文件寫入字符串
write:向Perl文件寫入格式化信息
printf:格式化字符串并輸出到Perl文件
這里簡單回顧一下,再講一些前面未提到的函數(shù)。

1)open函數(shù)

open函數(shù)將Perl文件變量與某Perl文件聯(lián)系起來,提供訪問Perl文件的接口,例如:open(MYVAR,"/u/file");如果Perl文件打開成功,則返回非零值,否則返回零。缺省地,open打開Perl文件用以讀取其內容,若想打開Perl文件以寫入內容,則在Perl文件名前加個大于號:open(MYVAR,">/u/file");向已有的Perl文件末尾添加內容用兩個大于號:open(MYVAR,">>/u/file");若想打開Perl文件作為數(shù)據導向的命令,則在命令前加上管道符(|):open(MAIL,"|maildave");

2)用open重定向輸入

可以把打開的Perl文件句柄用作向程序輸入數(shù)據的命令,方法是在命令后加管道符(|),如:
open(CAT,"catfile*|");
對open的調用運行命令catfile*,此命令創(chuàng)建一個臨時Perl文件,這個Perl文件的內容是所有以file打頭的Perl文件的內容連接而成,此Perl文件看作輸入Perl文件,可用Perl文件變量CAT訪問,如:
$input=;

下面的例子使用命令w的輸出來列出當前登錄的所有用戶名。

 
 
 
  1.  1:#!/usr/local/bin/perl
  2. 2:
  3. 3:open(WOUT,"w|");
  4. 4:$time=;
  5. 5:$time=~s/^*//;
  6. 6:$time=~s/.*//;
  7. 7:;#skipheadingsline
  8. 8:@users=;
  9. 9:close(WOUT);
  10. 10:foreach$user(@users){
  11. 11:$user=~s/.*//;
  12. 12:}
  13. 13:print("Currenttime:$time");
  14. 14:print("Usersloggedon:\n");
  15. 15:$prevuser="";
  16. 16:foreach$user(sort@users){
  17. 17:if($userne$prevuser){
  18. 18:print("\t$user");
  19. 19:$prevuser=$user;
  20. 20:}
  21. 21:}

 結果輸出如下:

Currenttime:4:25pm
Usersloggedon:
dave
kilroy
root
zarquon
w命令列出當前時間、系統(tǒng)負載和登錄的用戶,以及每個用戶的作業(yè)時間和當前運行的命令,如:

 
 
 
  1.   4:25pmup1day,6:37,6users,loadaverage:0.79,0.36,0.28
  2. Userttylogin@idleJCPUPCPUwhat
  3. davettyp02:26pm273w
  4. kilroyttyp19:01am2:271:0411-csh
  5. kilroyttyp29:02am431:4627rn
  6. rootttyp34:22pm2-csh
  7. zarquonttyp41:26pm44316ccmyprog.c
  8. kilroyttyp59:03am2:1448/usr/games/hack

上例中從w命令的輸出中取出所需的信息:當前時間和登錄的用戶名。第3行運行w命令,此處對open的調用指定w的輸出用作程序的輸入,用Perl文件變量WOUT來訪問該輸入。第4行讀取第一行信息,即:
4:25pmup1day,6:37,6users,loadaverage:0.79,0.36,0.28
接下來的兩行從這行中抽取出時間。首先,第5行刪除起始的空格,然后第6行刪去除時間和結尾換行符之間的所有字符,存入變量$time。
第7行從WOUT讀取第二行,這行中無有用信息,故不作處理。第8行把剩下的行賦給數(shù)組@users,然后第9行關閉WOUT,終止運行w命令的進程。

@users中的每個元素都是一行用戶信息,因為本程序只需要每行的第一個單詞,即用戶名,故10~12行去掉除換行符外的其它字符,這一循環(huán)結束后,@users中只剩下用戶名的列表。
第13行輸出存貯在$time中的時間,注意這時print不需要加上換行符,因為$time中有。16~21行對@users中的用戶名排序并輸出。因為同一個用戶可以多次登錄,所以用$preuser存貯輸出的最后一個用戶名,下次輸出數(shù)組元素$user時,如果其與$preser相等,則不輸出。

3)Perl文件重定向

許多UNIXshell可以把標準輸出Perl文件(STDOUT)和標準錯誤Perl文件(STDERR)都重定向到同一個Perl文件,例如在BourneShell(sh)中,命令
$foo>file12>&1
運行命令foo并把輸出到標準輸出Perl文件和標準錯誤Perl文件的內容存貯到Perl文件file1中。下面是用Perl實現(xiàn)這一功能的例子:

 
 
 
  1. 1:#!/usr/local/bin/perl
  2. 2:
  3. 3:open(STDOUT,">file1")||die("openSTDOUTfailed");
  4. 4:open(STDERR,">&STDOUT")||die("openSTDERRfailed");
  5. 5:printSTDOUT("line1\n");
  6. 6:printSTDERR("line2\n");
  7. 7:close(STDOUT);
  8. 8:close(STDERR);

運行后,Perl文件file1中的內容為:
line2
line1

可以看到,這兩行并未按我們想象的順序存貯,為什么呢?我們來分析一下這段程序。
第3行重定向標準輸出Perl文件,方法是打開Perl文件file1將它與Perl文件變量STDOUT關聯(lián),這也關閉了標準輸出Perl文件。第4行重定向標準錯誤Perl文件,參數(shù)>&STDOUT告訴Perl解釋器使用已打開并與STDOUT關聯(lián)的Perl文件,即Perl文件變量STDERR指向與STDOUT相同的Perl文件。第5、6行分別向STDOUT和STDERR寫入數(shù)據,因為這兩個Perl文件變量指向同一個Perl文件,故兩行字符串均寫到Perl文件file1中,但順序卻是錯誤的,怎么回事呢?

問題在于UNIX對輸出的處理上。當使用print(或其它函數(shù))寫入STDOUT等Perl文件時,UNIX操作系統(tǒng)真正所做的是把數(shù)據拷貝到一片特殊的內存即緩沖區(qū)中,接下來的輸出操作繼續(xù)寫入緩沖區(qū)直到寫滿,當緩沖區(qū)滿了,就把全部數(shù)據實際輸出。象這樣先寫入緩沖區(qū)再把整個緩沖區(qū)的內容輸出比每次都實際輸出所花費的時間要少得多,因為一般來說,I/O比內存操作慢得多。
程序結束時,任何非空的緩沖區(qū)都被輸出,然而,系統(tǒng)為STDOUT和STDERR分別維護一片緩沖區(qū),并且先輸出STDERR的內容,因此存貯在STDERR的緩沖區(qū)中的內容line2出現(xiàn)在存貯在STDOUT的緩沖區(qū)中的內容line1之前。

為了解決這個問題,可以告訴Perl解釋器不對Perl文件使用緩沖,方法為:
1、用select函數(shù)選擇Perl文件
2、把值1賦給系統(tǒng)變量$|
系統(tǒng)變量$|指定Perl文件是否進行緩沖而不管其是否應該使用緩沖。如果$|為非零值則不使用緩沖。$|與系統(tǒng)變量$~和$^協(xié)同工作,當未調用select函數(shù)時,$|影響當前缺省Perl文件。下例保證了輸出的次序:

 
 
 
  1. 1:#!/usr/local/bin/perl
  2. 2:
  3. 3:open(STDOUT,">file1")||die("openSTDOUTfailed");
  4. 4:open(STDERR,">&STDOUT")||die("openSTDERRfailed");
  5. 5:$|=1;
  6. 6:select(STDERR);
  7. 7:$|=1;
  8. 8:printSTDOUT("line1\n");
  9. 9:printSTDERR("line2\n");
  10. 10:close(STDOUT);
  11. 11:close(STDERR);

程序運行后,Perl文件file1中內容為:
line1
line2

第5行將$|賦成1,告訴Perl解釋器當前缺省Perl文件不進行緩沖,因為未調用select,當前的缺省Perl文件為重定向到Perl文件file1的STDOUT。第6行將當前缺省Perl文件設為STDERR,第7行又設置$|為1,關掉了重定向到file1的標準錯誤Perl文件的緩沖。由于STDOUT和STDERR的緩沖均被關掉,向其的輸出立刻被寫到Perl文件中,因此line1出現(xiàn)在第一行。#p#

4)指定讀寫權限

打開一個既可讀又可寫的Perl文件方法是在Perl文件名前加上"+>",如下:
open(READWRITE,"+>file1");
此語句打開既可讀又可寫的Perl文件file1,即可以重寫其中的內容。Perl文件讀寫操作最好與庫函數(shù)seek和tell一起使用,這樣可以跳到Perl文件任何一點。
注:也可用前綴"+<"指定可讀寫權限。

5)close函數(shù)

用于關閉打開的Perl文件。當用close關閉管道,即重定向的命令時,程序等待重定向的命令結束,如:
open(MYPIPE,"catfile*|");
close(MYPIPE);
當關閉此Perl文件變量時,程序暫停運行,直到命令catfile*運行完畢。

6)print,printf和write函數(shù)

print是這三個函數(shù)中最簡單的,它向指定的Perl文件輸出,如果未指定,則輸出到當前缺省Perl文件中,如:
print("Hello,there!\n");
printOUTFILE("Hello,there!\n");
第一句輸出到當前缺省Perl文件中,若未調用select,則為STDOUT。第二句輸出到由Perl文件變量OUTFILE指定的Perl文件中。

printf函數(shù)先格式化字符串再輸出到指定Perl文件或當前缺省Perl文件中,如:
printfOUTFILE(“Youoweme%8.2f",$owing);
此語句取出變量$owing的值并替換掉串中的%8.2f,%8.2f是域格式的例子,把$owing的值看作浮點數(shù)。
write函數(shù)使用輸出格式把信息輸出到Perl文件中,如:
select(OUTFILE);
$~="MYFORMAT";
write;
關于printf和write,詳見《第x章格式化輸出》。

7)select函數(shù)

select函數(shù)將通過參數(shù)傳遞的Perl文件變量指定為新的當前缺省Perl文件,如:
select(MYFILE);
這樣,MYFILE就成了當前缺省Perl文件,當對print、write和printf的調用未指定Perl文件時,就輸出到MYFILE中。

8)eof函數(shù)

eof函數(shù)查看最后一次讀Perl文件操作是否為Perl文件最后一個記錄,如果是,則返回非零值,如果Perl文件還有內容,返回零。
一般情況下,對eof的調用不加括號,因為eof和eof()是等效的,但與<>操作符一起使用時,eof和eof()就不同了?,F(xiàn)在我們來創(chuàng)建兩個Perl文件,分別叫做file1和file2。file1的內容為:
Thisisalinefromthefirstfile.
Hereisthelastlineofthefirstfile.
file2的內容為:
Thisisalinefromthesecondandlastfile.
Hereisthelastlineofthelastfile.

下面就來看一下eof和eof()的區(qū)別,第一個程序為:

 
 
 
  1. 1:#!/usr/local/bin/perl
  2. 2:
  3. 3:while($line=<>){
  4. 4:print($line);
  5. 5:if(eof){
  6. 6:print("--endofcurrentfile--\n");
  7. 7:}
  8. 8:}

運行結果如下:

 
 
 
  1. $programfile1file2
  2. Thisisalinefromthefirstfile.
  3. Hereisthelastlineofthefirstfile.
  4. --endofcurrentfile--
  5. Thisisalinefromthesecondandlastfile.
  6. Hereisthelastlineofthelastfile.
  7. --endofcurrentfile--
  8. $

 9)間接Perl文件變量

對于上述各函數(shù)open,close,print,printf,write,select和eof,都可以用簡單變量來代替Perl文件變量,這時,簡單變量中所存貯的字符串就被看作Perl文件變量名,下面就是這樣一個例子,此例很簡單,就不解釋了。需要指出的是,函數(shù)open,close,write,select和eof還允許用表達式來替代Perl文件變量,表達式的值必須是字符串,被用作Perl文件變量名。


文章名稱:深入學習Perl文件系統(tǒng)用法
文章地址:http://www.dlmjj.cn/article/ccdegeh.html