perl 檔案操作

2021-06-27 03:09:24 字數 3727 閱讀 5404

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 ...