perl中檔案操
基礎在perl中,提供了三種檔案控制代碼:stdin,stdout,stderr.它們可以由父程序建立的檔案或者裝置會自動開啟.一般使用open函式來建立檔案控制代碼.open函式的語法是唯讀模式時為:
open (filehandle,"somename");
其中filehandle是檔案控制代碼的名字,常用寫法是全部大寫字母(沒有特殊規則,沒有特殊字首).而somename就是你要開啟的檔案或裝置名字.這種方法開啟的檔案只可進行讀取動作.若要開啟檔案並需要進行寫入動作,可以用大於符放到檔案名字前面,語法就是覆蓋模式了:
open (filehandle,">somename");
當然,如檔案中早存在其他資料,你想在其後增加資料而不對原來資料進行任何動作的話,這個符號可以幫助你:>>,語法就變成了附加模式:
open (filehandle,">>somename");
另外,檔案開啟有時候會失敗(例如檔案不存在,檔案名字錯了等因素存在).所以在程式裡應該對檔案開啟成功與否進行測試,常用的方法是在open函式呼叫時利用其返回true/false的值,進行die短路效應測試,它的語法是:
open (filehandle,">somename") || die "error message:$!";
很多人不知道什麼叫"短路效應",就讓這個例子來為我們說明吧:譬如開啟檔案成功,則open函式返回true,此時因為||是or邏輯,乙個為真,則後面的沒有必要也沒有進行執行動作,所以就忽略(這和電子學上"短路了"一樣的道理)了die的執行;而在open函式返回false的時候,因為or邏輯前乙個為假,它必須執行右邊的die函式.
或許是die函式太難聽了(開玩笑的),perl還提供了乙個類似的函式warn,它與die很像:
open (filehandle,">somename") || warn "error message\n";
安全的開啟了檔案,那該如何使用呢? 其實使用檔案控制代碼讀取資料,就跟從stdin中讀取資料方法相同,舉個例子吧:
open (fh,"test.txt");
while()
如果你用覆蓋或者附加方式開啟檔案(《和<<),而且想用print函式對它進行寫入,則語句可以這樣寫:
print filehandle "data";
data是你要寫入的資料,看清楚,filehandle和data之間沒有逗號,只有空格!
在print函式裡,其實我們還可以累贅的寫成這樣:
print stdout "hello,world!\n";
但print預設就是向stdout輸出.所以此語句變的有點累贅且沒必要.
當然,用完了檔案,就要關閉:
close(filehandle);
雖然程式關閉時自動關閉所有開啟的檔案控制代碼,但養成檢查關閉習慣對良好的程式設計是非常有幫助.
基本的檔案操作已經學完,讓我們來舉個把a.txt檔案內容拷貝到b.txt檔案的例子吧:
open(inp,"a.txt") || die "can't open a.txt:$!";
open(out,"b.txt") || die "can't open b.txt:$!";
while()
close(in) || die "can't close a.txt:$!";
close(out) || die "can't close b.txt:$!";
開啟多檔案
如過我們要開啟的,並非乙個檔案,而是多個同字尾的檔案.那我們逐一開啟它嗎?
並不需要!
在unix裡,可以用echo命令瀏覽所有符合規則的檔案:
echo *.txt
而在perl中,我們可以使用glob函式(也有人叫它做"file glob").它的用法和也很相同:它每次會返回乙個在當前目錄下,符合條件的檔名.如果所有符合條件的檔名都已經傳完,它就返回undef.
比如要讀取/home/globtest目錄中的所有.pl檔案,可以這樣寫:
@plfiles
=glob
'/home/globtest/*.pl';
又如:
while (my $file = glob "*.dat" )}
檔案測試
新開乙個檔案時,在安全角度來講絕對有必要進行同名檔案是否已存在的測試.在shell指令碼裡,可以用-e filename做這件事情,而在perl中也很像:-e $filename.若檔案存在返回真,否則返回假.例子如:
$filename = "a.txt";
if(-e $filename) else
還可以對檔案控制代碼進行可讀/可寫測試.分別是-r,-w.用法和上面-e $filename一樣.如檢測乙個檔案是否可讀可寫,則可以:
if(-r filename && -w filename)
下面給出檔案測試和它的意義的列表:
-r 檔案或目錄可讀
-w 檔案或目錄可寫
-x 檔案或目錄執行
-o 檔案或目錄歸使用者所有
-r 檔案或目錄對真正使用者可讀
-w 檔案或目錄對真正使用者可寫
-x 檔案或目錄對真正使用者執行
-o 檔案或目錄歸真正使用者所有
-e 檔案或目錄存在
-z 檔案存在且大小為0
-s 檔案或目錄存在且不為0(返回位元組數)
-f 檔案為普通檔案
-d 檔案為目錄
-l 檔案為符號鏈結
-p 檔案為命名管道(fifo)
-s 檔案為乙個套口(socket)
-b 檔案為塊特殊檔案
-c 檔案為字元特殊檔案
-t 開啟tty控制台的檔案控制代碼
-u 檔案或目錄是設定使用者id號
-g 檔案或目錄是設定使用者組id號
-k 檔案或目錄的sticky位置位
-t 檔案是文字檔案
-b 檔案是二進位制檔案
-m 以天為單位的存在時間
-a 以天為單位訪問時間
-c 以天為單位同**更改時間
其中大部分是返回true/fals,其中幾個例外:
-s:如果檔案不是空,返回真.不過這個"真"是檔案的長度.(單位是byte.)
-m,-a,-c:返回的是時間,全部用天或1/2天的單位表示,所以36小時被表示為1.5天(如果比較某乙個檔案比後乙個檔案早一分鐘(或者短時間的比較)的話,你可能要用rangecomparision的方法.).
改頭換"名"
為某個檔案改名字,可以使用rename函式並進行die短路測試:
rename ("old-filename","new-filename") || die "error message:$!";
刪除檔案
用unlink函式,可以刪除檔案,語法是:
unlink ("filename");
開啟目錄控制代碼
語法:opendir(directory-name,"dir") || die "error message:$!";
例子:opendir(dh,"/***") || die "開啟目錄錯誤:$!";
關閉目錄控制代碼
語法:closedir(directory-name);
例子:closedir(dh);
建立目錄
語法:madir("directory-name",permission) || die "error message:@!";
其中permission表示許可權的意思.如0777
刪除目錄
語法:rmdir("directory-name"); # 當然,也可以進行die短路測試
perl 檔案操作
1 讀取某檔案,如果該檔案不存在,則報錯,並提示出錯原因 open db,home ellie myfile or die can t open file n 2 讀寫檔案的方法 open fh,opens filename for reading.讀 the symbol is optional....
perl 檔案操作總結
一 開啟 關閉檔案 open的返回值用來確定開啟檔案的操作是否成功,當其成功時返回非零值,失敗時返回零,因此可以如下判斷 if open myfile,myfile 當檔案操作完畢後,用close myfile 關閉檔案。讀 open 檔案控制代碼,檔名 open 檔案控制代碼,檔名 前提檔案必須已...
perl的檔案操作 1
假如有乙個從web上拷貝下來的檔案 01 usr bin perl w 02 03 use tk 04 05 tk strictmotif 1 06 07 main mainwindow new 08 09 button1 main button text exit 10 command exit ...