自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

深入學(xué)習(xí)Perl文件系統(tǒng)用法

開發(fā) 架構(gòu)
在學(xué)習(xí)Perl語言的過程中,經(jīng)常會遇到有關(guān)Perl文件的問題,這里向大家簡單介紹一下,希望本文的介紹你對你有所幫助。

 

 

 Perl文件系統(tǒng)

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

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

本節(jié)講述從Perl文件中讀取信息和向Perl文件寫入信息的內(nèi)置庫函數(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文件用以讀取其內(nèi)容,若想打開Perl文件以寫入內(nèi)容,則在Perl文件名前加個大于號:open(MYVAR,">/u/file");向已有的Perl文件末尾添加內(nèi)容用兩個大于號:open(MYVAR,">>/u/file");若想打開Perl文件作為數(shù)據(jù)導(dǎo)向的命令,則在命令前加上管道符(|):open(MAIL,"|maildave");

2)用open重定向輸入

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

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

  1.  1:#!/usr/local/bin/perl  
  2. 2:  
  3. 3:open(WOUT,"w|");  
  4. 4:$time=<WOUT>;  
  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:}  

 結(jié)果輸出如下:

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

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

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

3)Perl文件重定向

許多UNIXshell可以把標(biāo)準(zhǔn)輸出Perl文件(STDOUT)和標(biāo)準(zhǔn)錯誤Perl文件(STDERR)都重定向到同一個Perl文件,例如在BourneShell(sh)中,命令
$foo>file12>&1
運(yùn)行命令foo并把輸出到標(biāo)準(zhǔn)輸出Perl文件和標(biāo)準(zhǔn)錯誤Perl文件的內(nèi)容存貯到Perl文件file1中。下面是用Perl實(shí)現(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);  

運(yùn)行后,Perl文件file1中的內(nèi)容為:
line2
line1

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

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

為了解決這個問題,可以告訴Perl解釋器不對Perl文件使用緩沖,方法為:
1、用select函數(shù)選擇Perl文件
2、把值1賦給系統(tǒng)變量$|
系統(tǒng)變量$|指定Perl文件是否進(jìn)行緩沖而不管其是否應(yīng)該使用緩沖。如果$|為非零值則不使用緩沖。$|與系統(tǒng)變量$~和$^協(xié)同工作,當(dāng)未調(diào)用select函數(shù)時,$|影響當(dāng)前缺省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);  

程序運(yùn)行后,Perl文件file1中內(nèi)容為:
line1
line2

第5行將$|賦成1,告訴Perl解釋器當(dāng)前缺省Perl文件不進(jìn)行緩沖,因?yàn)槲凑{(diào)用select,當(dāng)前的缺省Perl文件為重定向到Perl文件file1的STDOUT。第6行將當(dāng)前缺省Perl文件設(shè)為STDERR,第7行又設(shè)置$|為1,關(guān)掉了重定向到file1的標(biāo)準(zhǔn)錯誤Perl文件的緩沖。由于STDOUT和STDERR的緩沖均被關(guān)掉,向其的輸出立刻被寫到Perl文件中,因此line1出現(xiàn)在第一行。#p#

4)指定讀寫權(quán)限

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

5)close函數(shù)

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

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

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

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

7)select函數(shù)

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

8)eof函數(shù)

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

下面就來看一下eof和eof()的區(qū)別,第一個程序?yàn)椋?/p>

  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:}  

運(yùn)行結(jié)果如下: 

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

 9)間接Perl文件變量

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

【編輯推薦】

  1. Perl文件讀寫方法詳解
  2. 解析讀寫Perl文件的簡明步驟
  3. 實(shí)例解析Perl守護(hù)進(jìn)程用法
  4. 學(xué)習(xí)筆記 如何讀寫Perl文件
  5. 術(shù)語匯編 Perl變量中Perl關(guān)聯(lián)數(shù)組用法解析

 

責(zé)任編輯:佚名 來源: csdn.net
相關(guān)推薦

2010-07-14 17:43:25

Perl運(yùn)算符

2010-07-14 13:18:40

Perl開發(fā)工具

2010-08-26 09:58:01

CSS clear

2010-07-12 15:00:56

UML狀態(tài)機(jī)視圖

2010-08-24 09:52:55

DIV標(biāo)簽

2010-09-02 09:09:38

display:inlCSS

2010-08-19 12:55:55

CSSMarginPadding

2010-08-23 09:01:45

MarginPadding

2010-07-12 13:09:05

UML協(xié)作圖

2014-07-22 13:09:21

android

2010-01-26 13:41:50

Android文件系統(tǒng)

2009-11-17 14:13:34

PHP配置

2015-09-29 08:57:46

javascript對象

2010-08-16 11:05:54

DIV+CSS

2010-03-04 13:42:28

Linux操作系統(tǒng)

2010-04-08 16:49:36

Unix操作系統(tǒng)

2010-07-08 13:55:21

UML建模

2021-05-31 07:50:59

Linux文件系統(tǒng)

2013-10-09 11:07:31

日志文件系統(tǒng)

2010-06-29 15:29:22

UML建模流程
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號