成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

深入學習Perl文件系統用法

開發 架構
在學習Perl語言的過程中,經常會遇到有關Perl文件的問題,這里向大家簡單介紹一下,希望本文的介紹你對你有所幫助。

 

 

 Perl文件系統

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

一、Perl文件輸入/輸出函數

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

1、基本I/O函數

一些I/O函數在前面的章節中已有講述,如

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

1)open函數

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

2)用open重定向輸入

可以把打開的Perl文件句柄用作向程序輸入數據的命令,方法是在命令后加管道符(|),如:
open(CAT,"catfile*|");
對open的調用運行命令catfile*,此命令創建一個臨時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=<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:}  

 結果輸出如下:

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

  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行把剩下的行賦給數組@users,然后第9行關閉WOUT,終止運行w命令的進程。

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

3)Perl文件重定向

許多UNIXshell可以把標準輸出Perl文件(STDOUT)和標準錯誤Perl文件(STDERR)都重定向到同一個Perl文件,例如在BourneShell(sh)中,命令
$foo>file12>&1
運行命令foo并把輸出到標準輸出Perl文件和標準錯誤Perl文件的內容存貯到Perl文件file1中。下面是用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: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關聯,這也關閉了標準輸出Perl文件。第4行重定向標準錯誤Perl文件,參數>&STDOUT告訴Perl解釋器使用已打開并與STDOUT關聯的Perl文件,即Perl文件變量STDERR指向與STDOUT相同的Perl文件。第5、6行分別向STDOUT和STDERR寫入數據,因為這兩個Perl文件變量指向同一個Perl文件,故兩行字符串均寫到Perl文件file1中,但順序卻是錯誤的,怎么回事呢?

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

為了解決這個問題,可以告訴Perl解釋器不對Perl文件使用緩沖,方法為:
1、用select函數選擇Perl文件
2、把值1賦給系統變量$|
系統變量$|指定Perl文件是否進行緩沖而不管其是否應該使用緩沖。如果$|為非零值則不使用緩沖。$|與系統變量$~和$^協同工作,當未調用select函數時,$|影響當前缺省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出現在第一行。#p#

4)指定讀寫權限

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

5)close函數

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

6)print,printf和write函數

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

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

7)select函數

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

8)eof函數

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

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

  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.  

 9)間接Perl文件變量

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

【編輯推薦】

  1. Perl文件讀寫方法詳解
  2. 解析讀寫Perl文件的簡明步驟
  3. 實例解析Perl守護進程用法
  4. 學習筆記 如何讀寫Perl文件
  5. 術語匯編 Perl變量中Perl關聯數組用法解析

 

責任編輯:佚名 來源: csdn.net
相關推薦

2010-07-14 17:43:25

Perl運算符

2010-07-14 13:18:40

Perl開發工具

2010-08-26 09:58:01

CSS clear

2010-07-12 15:00:56

UML狀態機視圖

2010-08-24 09:52:55

DIV標簽

2010-08-19 12:55:55

CSSMarginPadding

2010-09-02 09:09:38

display:inlCSS

2010-07-12 13:09:05

UML協作圖

2010-08-23 09:01:45

MarginPadding

2014-07-22 13:09:21

android

2010-01-26 13:41:50

Android文件系統

2015-09-29 08:57:46

javascript對象

2009-11-17 14:13:34

PHP配置

2010-08-16 11:05:54

DIV+CSS

2010-03-04 13:42:28

Linux操作系統

2010-04-08 16:49:36

Unix操作系統

2010-07-08 13:55:21

UML建模

2021-05-31 07:50:59

Linux文件系統

2013-10-09 11:07:31

日志文件系統

2020-03-23 14:15:51

RadonDB安裝數據庫
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 91视频www.| 国产成人99久久亚洲综合精品 | 国产成人av在线 | 日韩精品一区二区三区中文字幕 | 日本视频在线播放 | 九九综合 | 337p日本欧洲亚洲大胆精蜜臀 | 欧美h| 午夜国产在线 | 午夜视频在线播放 | va精品| 国产1区在线 | 欧美日一区二区 | 综合久久色 | 精品毛片在线观看 | 完全免费av在线 | 国产精品一区在线观看你懂的 | 欧美性视频在线播放 | 国产成人免费 | 成年免费在线观看 | 成人精品视频99在线观看免费 | 日日干夜夜草 | 国产精品久久久久久久久免费相片 | 国产精品一区在线观看 | 免费一看一级毛片 | 国产视频一区在线 | www..99re| 欧美精品一二三区 | www国产亚洲精品久久网站 | 国产精品久久久久久 | 夜夜草 | 精品国产乱码久久久久久丨区2区 | 一本一道久久a久久精品综合蜜臀 | 欧美亚洲国产日韩 | 亚洲一区 中文字幕 | 综合久久久 | 午夜精品久久久久久久星辰影院 | 久久久人| av手机免费在线观看 | 久久中文字幕一区 | 91av在线免费观看 |