?? perl11.htm
字號:
<html><!-- #BeginTemplate "/Templates/index.dwt" --><head><meta http-equiv=Content-Type content="text/html; charset=gb_2312-80"><title>ChinaPerl</title>
<LINK rel=stylesheet href=mystyle.css type=text/css>
</head><body>
<table border=0 cellspacing=0 bgcolor=#80FFFF width=100%>
<tr>
<td align=left rowspan=2 width=150>
<div align="center"><img src=image/perl.gif height=85 width="85"></div>
</td>
<td align=center><img src=image/perl.gif height=85 width="85"></td>
</tr><tr>
<td colspan=2 align=center> </td>
</tr></table>
<table border=0 width=100% height=400 cellspacing=0 cellpadding=0>
<tr>
<td width=20% valign=top bgcolor="#dddddd">
<table border=0 width=100% cellpadding=0><tr><td width=5%></td>
<td width=95%>
<p align=center>Perl 5教程<br>
<a target=_blank href=http://flamephoenix.126.com>by flamephoenix</a><a href="http://perl.yesky.net"><br>
<font color="red">修訂 by RNY<br>
</font></a>2000-08-30</p>
<p align=center><a href="index.htm">目錄</a></p>
<p align=center>第一部分 Perl語言</p>
<p><a href=perl1.htm>第一章 概述</a></p>
<p><a href=perl2.htm>第二章 簡單變量</a></p>
<p><a href=perl3.htm>第三章 操作符</a></p>
<p><a href=perl4.htm>第四章 列表和數(shù)組變量</a></p>
<p><a href=perl5.htm>第五章 文件讀寫</a></p>
<p><a href=perl6.htm>第六章 模式匹配</a></p>
<p><a href=perl7.htm>第七章 控制結構</a></p>
<p><a href=perl8.htm>第八章 子程序</a></p>
<p><a href=perl9.htm>第九章 關聯(lián)數(shù)組(哈希表)</a></p>
<p><a href=perl10.htm>第十章 格式化輸出</a></p>
<p><a href=perl11.htm>第十一章 文件系統(tǒng)</a></p>
<p><a href=perl12.htm>第十二章 引用(指針)</a></p>
<p><a href=perl13.htm>第十三章 面向對象編程</a></p>
<p><a href=perl14.htm>第十四章 包和模塊</a></p>
<p><a href=func.htm>附錄一 函數(shù)集</a></p>
<p align=center>第二部分 Perl的CGI應用</p>
<p><a href=cgi1.htm>第一章 cgilib例</a></p>
<p><a href=cgi2.htm>第二章 動態(tài)創(chuàng)建圖像</a></p>
<p><a href=cgi3.htm>第三章 計數(shù)器的編寫方法</a></p>
<p><a href=cgi4.htm>第四章 Web Server設置</a></p>
第五章、...<br></td></tr></table></td>
<td width=80% valign=top>
<div align="center"></div>
<table border=0 width=100% cellpadding=0>
<tr bgcolor="#00FF80">
<td colspan="2">
<div align="center"> Perl教程 | <a href="perl5manual.zip">下載全文</a>
| <a target=_blank href=http://www.turbolinux.com.cn/cgi-bin/linux/wwwthreads.pl?action=list&Board=perl>Perl論壇</a>
| <a href="http://perl.yesky.net">推薦站點</a> | 關于我們 </div>
</td>
</tr>
<tr>
<td colspan="2"><!-- #BeginEditable "body" -->
<p align=center>第十一章 文件系統(tǒng)</p>
<p align=center><a target=_blank href=http://flamephoenix.126.com>by
flamephoenix</a></p>
<a href=#1>一、文件輸入/輸出函數(shù)</a><br>
<a href=#1.1>1、基本I/O函數(shù)</a><br>
<a href=#1.1.1>1)open函數(shù)</a><br>
<a href=#1.1.2>2)用open重定向輸入</a><br>
<a href=#1.1.3>3)文件重定向</a><br>
<a href=#1.1.4>4)指定讀寫權限</a><br>
<a href=#1.1.5>5)close函數(shù)</a><br>
<a href=#1.1.6>6)print, printf和write函數(shù)</a><br>
<a href=#1.1.7>7)select函數(shù)</a><br>
<a href=#1.1.8>8)eof函數(shù)</a><br>
<a href=#1.1.9>9)間接文件變量</a><br>
<a href=#1.2>2、跳過和重讀數(shù)據(jù)</a><br>
<a href=#1.3>3、系統(tǒng)讀寫函數(shù)</a><br>
<a href=#1.4>4、用getc讀取字符</a><br>
<a href=#1.5>5、用binmode讀取二進制文件</a><br>
<a href=#2>二、目錄處理函數(shù)</a><br>
<a href=#2.1>1、mkdir</a><br>
<a href=#2.2>2、chdir</a><br>
<a href=#2.3>3、opendir</a><br>
<a href=#2.4>4、closedir</a><br>
<a href=#2.5>5、readdir</a><br>
<a href=#2.6>6、telldir</a><br>
<a href=#2.7>7、seekdir</a><br>
<a href=#2.8>8、rewinddir</a><br>
<a href=#2.9>9、rmdir</a><br>
<a href=#3>三、文件屬性函數(shù)</a><br>
<a href=#3.1>1、文件重定位函數(shù)</a><br>
<a href=#3.2>2、鏈接和符號鏈接函數(shù)</a><br>
<a href=#3.3>3、文件許可權函數(shù)</a><br>
<a href=#3.4>4、其他屬性函數(shù)</a><br>
<a href=#4>四、使用DBM文件</a><br>
<br>
本章所講的函數(shù)多數(shù)使用了UNIX操作系統(tǒng)的特性,在非UNIX系統(tǒng)中,一些函數(shù)可能沒有定義或有不同的工作方式,使用時請查看Perl聯(lián)機文檔。<br>
<a name=1>一、文件輸入/輸出函數(shù)</a><br>
本節(jié)講述從文件中讀取信息和向文件寫入信息的內置庫函數(shù)。<br>
<a name=1.1>1、基本I/O函數(shù)</a><br>
一些I/O函數(shù)在前面的章節(jié)中已有講述,如<br>
<blockquote>
<li>open:允許程序訪問文件</li>
<li>close:終止文件訪問</li>
<li>print:文件寫入字符串</li>
<li>write:向文件寫入格式化信息</li>
<li>printf:格式化字符串并輸出到文件</li>
</blockquote>
這里簡單回顧一下,再講一些前面未提到的函數(shù)。<br>
<a name=1.1.1>1)open函數(shù)</a><br>
open函數(shù)將文件變量與某文件聯(lián)系起來,提供訪問文件的接口,例如:open(MYVAR,
"/u/file"); 如果文件打開成功,則返回非零值,否則返回零。缺省地,open打開文件用以讀取其內容,若想打開文件以寫入內容,則在文件名前加個大于號:open(MYVAR,
">/u/file"); 向已有的文件末尾添加內容用兩個大于號:open(MYVAR, ">>/u/file"); 若想打開文件作為數(shù)據(jù)導向的命令,則在命令前加上管道符(|):open(MAIL,
"|mail dave");<br>
<a name=1.1.2>2)用open重定向輸入</a><br>
可以把打開的文件句柄用作向程序輸入數(shù)據(jù)的命令,方法是在命令后加管道符(|),如:<br>
open(CAT, "cat file*|");<br>
對open的調用運行命令cat file* ,此命令創(chuàng)建一個臨時文件,這個文件的內容是所有以file打頭的文件的內容連接而成,此文件看作輸入文件,可用文件變量CAT訪問,如:<br>
$input = <cat>;<br>
下面的例子使用命令w的輸出來列出當前登錄的所有用戶名。<br>
<blockquote>1 : #!/usr/local/bin/perl<br>
2 :<br>
3 : open (WOUT, "w|");<br>
4 : $time = <WOUT>;<br>
5 : $time =~ s/^ *//;<br>
6 : $time =~ s/ .*//;<br>
7 : <wout>; # skip headings line<br>
8 : @users = <wout>;<br>
9 : close (WOUT);<br>
10: foreach $user (@users) {<br>
11: $user =~ s/ .*//;<br>
12: }<br>
13: print ("Current time: $time");<br>
14: print ("Users logged on:\n");<br>
15: $prevuser = "";<br>
16: foreach $user (sort @users) {<br>
17: if ($user ne $prevuser) {<br>
18: print ("\t$user");<br>
19: $prevuser = $user;<br>
20: }<br>
21: }</blockquote>
結果輸出如下:<br>
<blockquote>Current time: 4:25pm<br>
Users logged on:<br>
dave<br>
kilroy<br>
root<br>
zarquon</blockquote>
w命令列出當前時間、系統(tǒng)負載和登錄的用戶,以及每個用戶的作業(yè)時間和當前運行的命令,如:<br>
<blockquote>
<pre>
4:25pm up 1 day, 6:37, 6 users, load average: 0.79, 0.36, 0.28
User tty login@ idle JCPU PCPU what
dave ttyp0 2:26pm 27 3 w
kilroy ttyp1 9:01am 2:27 1:04 11 -csh
kilroy ttyp2 9:02am 43 1:46 27 rn
root ttyp3 4:22pm 2 -csh
zarquon ttyp4 1:26pm 4 43 16 cc myprog.c
kilroy ttyp5 9:03am 2:14 48 /usr/games/hack</pre>
</blockquote>
上例中從w命令的輸出中取出所需的信息:當前時間和登錄的用戶名。第3行運行w命令,此處對open的調用指定w的輸出用作程序的輸入,用文件變量WOUT來訪問該輸入。第4行讀取第一行信息,即:<br>
4:25pm up 1 day, 6:37, 6 users, load average:
0.79, 0.36, 0.28<br>
接下來的兩行從這行中抽取出時間。首先,第5行刪除起始的空格,然后第6行刪去除時間和結尾換行符之間的所有字符,存入變量$time。<br>
第7行從WOUT讀取第二行,這行中無有用信息,故不作處理。第8行把剩下的行賦給數(shù)組@users,然后第9行關閉WOUT,終止運行w命令的進程。<br>
@users中的每個元素都是一行用戶信息,因為本程序只需要每行的第一個單詞,即用戶名,故10~12行去掉除換行符外的其它字符,這一循環(huán)結束后,@users中只剩下用戶名的列表。<br>
第13行輸出存貯在$time中的時間,注意這時print不需要加上換行符,因為$time中有。16~21行對@users中的用戶名排序并輸出。因為同一個用戶可以多次登錄,所以用$preuser存貯輸出的最后一個用戶名,下次輸出數(shù)組元素$user時,如果其與$preser相等,則不輸出。<br>
<a name=1.1.3>3)文件重定向</a><br>
許多UNIX shell可以把標準輸出文件(STDOUT)和標準錯誤文件(STDERR)都重定向到同一個文件,例如在Bourne
Shell(sh)中,命令<br>
$ foo > file1 2>&1<br>
運行命令foo并把輸出到標準輸出文件和標準錯誤文件的內容存貯到文件file1中。下面是用Perl實現(xiàn)這一功能的例子:<br>
<blockquote>1: #!/usr/local/bin/perl<br>
2:<br>
3: open (STDOUT, ">file1") || die ("open STDOUT failed");<br>
4: open (STDERR, ">&STDOUT") || die ("open STDERR failed");<br>
5: print STDOUT ("line 1\n");<br>
6: print STDERR ("line 2\n");<br>
7: close (STDOUT);<br>
8: close (STDERR);</blockquote>
運行后,文件file1中的內容為:<br>
line 2<br>
line 1<br>
可以看到,這兩行并未按我們想象的順序存貯,為什么呢?我們來分析一下這段程序。<br>
第3行重定向標準輸出文件,方法是打開文件file1將它與文件變量STDOUT關聯(lián),這也關閉了標準輸出文件。第4行重定向標準錯誤文件,參數(shù)>&STDOUT告訴Perl解釋器使用已打開并與STDOUT關聯(lián)的文件,即文件變量STDERR指向與STDOUT相同的文件。第5、6行分別向STDOUT和STDERR寫入數(shù)據(jù),因為這兩個文件變量指向同一個文件,故兩行字符串均寫到文件file1中,但順序卻是錯誤的,怎么回事呢?<br>
問題在于UNIX對輸出的處理上。當使用print(或其它函數(shù))寫入STDOUT等文件時,UNIX操作系統(tǒng)真正所做的是把數(shù)據(jù)拷貝到一片特殊的內存即緩沖區(qū)中,接下來的輸出操作繼續(xù)寫入緩沖區(qū)直到寫滿,當緩沖區(qū)滿了,就把全部數(shù)據(jù)實際輸出。象這樣先寫入緩沖區(qū)再把整個緩沖區(qū)的內容輸出比每次都實際輸出所花費的時間要少得多,因為一般來說,I/O比內存操作慢得多。<br>
程序結束時,任何非空的緩沖區(qū)都被輸出,然而,系統(tǒng)為STDOUT和STDERR分別維護一片緩沖區(qū),并且先輸出STDERR的內容,因此存貯在STDERR的緩沖區(qū)中的內容line
2出現(xiàn)在存貯在STDOUT的緩沖區(qū)中的內容line 1之前。<br>
為了解決這個問題,可以告訴Perl解釋器不對文件使用緩沖,方法為:<br>
1、用select函數(shù)選擇文件<br>
2、把值1賦給系統(tǒng)變量$|<br>
系統(tǒng)變量$|指定文件是否進行緩沖而不管其是否應該使用緩沖。如果$|為非零值則不使用緩沖。$|與系統(tǒng)變量$~和$^協(xié)同工作,當未調用select函數(shù)時,$|影響當前缺省文件。下例保證了輸出的次序:<br>
<blockquote>1 : #!/usr/local/bin/perl<br>
2 :<br>
3 : open (STDOUT, ">file1") || die ("open STDOUT failed");<br>
4 : open (STDERR, ">&STDOUT") || die ("open STDERR failed");<br>
5 : $| = 1;<br>
6 : select (STDERR);<br>
7 : $| = 1;<br>
8 : print STDOUT ("line 1\n");<br>
9 : print STDERR ("line 2\n");<br>
10: close (STDOUT);<br>
11: close (STDERR);</blockquote>
程序運行后,文件file1中內容為:<br>
line 1<br>
line 2<br>
第5行將$|賦成1,告訴Perl解釋器當前缺省文件不進行緩沖,因為未調用select,當前的缺省文件為重定向到文件file1的STDOUT。第6行將當前缺省文件設為STDERR,第7行又設置$|為1,關掉了重定向到file1的標準錯誤文件的緩沖。由于STDOUT和STDERR的緩沖均被關掉,向其的輸出立刻被寫到文件中,因此line
1出現(xiàn)在第一行。<br>
<a name=1.1.4>4)指定讀寫權限</a><br>
打開一個既可讀又可寫的文件方法是在文件名前加上"+>",如下:<br>
open (READWRITE, "+>file1");<br>
此語句打開既可讀又可寫的文件file1,即可以重寫其中的內容。文件讀寫操作最好與庫函數(shù)seek和tell一起使用,這樣可以跳到文件任何一點。<br>
注:也可用前綴"+<"指定可讀寫權限。<br>
<a name="1.1.5">5)close函數(shù)</a><br>
用于關閉打開的文件。當用close關閉管道,即重定向的命令時,程序等待重定向的命令結束,如:<br>
open (MYPIPE, "cat file*|");<br>
close (MYPIPE);<br>
當關閉此文件變量時,程序暫停運行,直到命令cat file*運行完畢。<br>
<a name="1.1.6">6)print, printf和write函數(shù)</a><br>
print是這三個函數(shù)中最簡單的,它向指定的文件輸出,如果未指定,則輸出到當前缺省文件中,如:<br>
print ("Hello, there!\n");<br>
print OUTFILE ("Hello, there!\n");<br>
第一句輸出到當前缺省文件中,若未調用select,則為STDOUT。第二句輸出到由文件變量OUTFILE指定的文件中。<br>
printf函數(shù)先格式化字符串再輸出到指定文件或當前缺省文件中,如:<br>
printf OUTFILE (“You owe me %8.2f", $owing);<br>
此語句取出變量$owing的值并替換掉串中的%8.2f,%8.2f是域格式的例子,把$owing的值看作浮點數(shù)。<br>
write函數(shù)使用輸出格式把信息輸出到文件中,如:<br>
select (OUTFILE);<br>
$~ = "MYFORMAT";<br>
write;<br>
關于printf和write,詳見《第x章 格式化輸出》。<br>
<a name=1.1.7>7)select函數(shù)</a><br>
select函數(shù)將通過參數(shù)傳遞的文件變量指定為新的當前缺省文件,如:<br>
select (MYFILE);<br>
這樣,MYFILE就成了當前缺省文件,當對print、write和printf的調用未指定文件時,就輸出到MYFILE中。<br>
<a name=1.1.8>8)eof函數(shù)</a><br>
eof函數(shù)查看最后一次讀文件操作是否為文件最后一個記錄,如果是,則返回非零值,如果文件還有內容,返回零。<br>
一般情況下,對eof的調用不加括號,因為eof和eof()是等效的,但與<>操作符一起使用時,eof和eof()就不同了?,F(xiàn)在我們來創(chuàng)建兩個文件,分別叫做file1和file2。file1的內容為:<br>
This is a line from the first file.<br>
Here is the last line of the first file.<br>
file2的內容為:<br>
This is a line from the second and last file.<br>
Here is the last line of the last file.<br>
下面就來看一下eof和eof()的區(qū)別,第一個程序為:<br>
<blockquote>1: #!/usr/local/bin/perl<br>
2:<br>
3: while ($line = <>) {<br>
4: print ($line);<br>
5: if (eof) {<br>
6: print ("-- end of current file --\n");<br>
7: }<br>
8: }</blockquote>
運行結果如下:<br>
<blockquote>$ program file1 file2<br>
This is a line from the first file.<br>
Here is the last line of the first file.<br>
-- end of current file --<br>
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -