日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

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

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

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

 Perl文件系統(tǒng)

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

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

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

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

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

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

1)open函數(shù)

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

2)用open重定向輸入

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

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

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

 結(jié)果輸出如下:

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

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

3)Perl文件重定向

許多UNIXshell可以把標(biāo)準(zhǔn)輸出Perl文件(STDOUT)和標(biāo)準(zhǔn)錯(cuò)誤Perl文件(STDERR)都重定向到同一個(gè)Perl文件,例如在BourneShell(sh)中,命令
$foo>file12>&1
運(yùn)行命令foo并把輸出到標(biāo)準(zhǔn)輸出Perl文件和標(biāo)準(zhǔn)錯(cuò)誤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

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

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

為了解決這個(gè)問(wèn)題,可以告訴Perl解釋器不對(duì)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ù)時(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)錯(cuò)誤Perl文件的緩沖。由于STDOUT和STDERR的緩沖均被關(guān)掉,向其的輸出立刻被寫(xiě)到Perl文件中,因此line1出現(xiàn)在第一行。#p#

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

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

5)close函數(shù)

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

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

print是這三個(gè)函數(shù)中最簡(jiǎn)單的,它向指定的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);
此語(yǔ)句取出變量$owing的值并替換掉串中的%8.2f,%8.2f是域格式的例子,把$owing的值看作浮點(diǎn)數(shù)。
write函數(shù)使用輸出格式把信息輸出到Perl文件中,如:
select(OUTFILE);
$~="MYFORMAT";
write;
關(guān)于printf和write,詳見(jiàn)《第x章格式化輸出》。

7)select函數(shù)

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

8)eof函數(shù)

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

下面就來(lái)看一下eof和eof()的區(qū)別,第一個(gè)程序?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)間接Perl文件變量

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


標(biāo)題名稱:深入學(xué)習(xí)Perl文件系統(tǒng)用法
文章出自:http://www.5511xx.com/article/ccdegeh.html