Perl 文件操作
02-02
- 簡介
- Perl 使用一種叫做文件句柄類型的變數來操作文件。
- 從文件讀取或者寫入數據需要使用文件句柄。
- 文件句柄(file handle)是一個I/O連接的名稱。
- Perl提供了三種文件句柄:STDIN,STDOUT,STDERR,分別代表標準輸入、標準輸出和標準出錯輸出。
- Perl 中打開文件可以使用以下方式:
- open FILEHANDLE, EXPR
- open FILEHANDLE
- sysopen FILEHANDLE, FILENAME, MODE, PERMS
- sysopen FILEHANDLE, FILENAME, MODE
- 參數說明:
- FILEHANDLE:文件句柄,用於存放一個文件唯一標識符。
- EXPR:文件名及文件訪問類型組成的表達式。
- MODE:文件訪問類型。
- PERMS:訪問許可權位(permission bits)。
- Open 函數
- 以下代碼我們使用 open 函數以只讀的方式(<)打開文件 file.txt:
- open(DATA, "<file.txt");
- 訪問模式
- 模式 描述
- < 或 rt只讀方式打開,將文件指針指向文件頭。
- > 或 wt寫入方式打開,將文件指針指向文件頭並將文件大小截為零。如果文件不存在則嘗試創建之。
- >> 或 at寫入方式打開,將文件指針指向文件末尾。如果文件不存在則嘗試創建之。
- +< 或 r+t讀寫方式打開,將文件指針指向文件頭。
- +> 或 w+t讀寫方式打開,將文件指針指向文件頭並將文件大小截為零。如果文件不存在則嘗試創建之。
- +>> 或 a+t讀寫方式打開,將文件指針指向文件末尾。如果文件不存在則嘗試創建之。
- Sysopen函數
- Close 函數
- 在文件使用完後,要關閉文件,以刷新與文件句柄相關聯的輸入輸出緩衝區,關閉文件的語法如下:
- close FILEHANDLE
- close(DATA) || die "無法關閉文件";
- 讀寫文件
- 向文件讀寫信息有以下幾種不同的方式:
- <FILEHANDL> 操作符
- $name = <STDIN>;
- 或是數組
- @lines = <DATA>;
- print @lines; # 輸出數組內容
- getc 函數
- getc 函數從指定的 FILEHANDLE 返回單一的字元,如果沒指定返回 STDIN:
- getc FILEHANDLE
- 如果發生錯誤,或在文件句柄在文件末尾,則返回 undef。
- read 函數
- read 函數用於從緩衝區的文件句柄讀取信息。
- 這個函數用於從文件讀取二進位數據。
- read FILEHANDLE, SCALAR, LENGTH, OFFSET
- read FILEHANDLE, SCALAR, LENGTH
- 參數說明:
- FILEHANDLE:文件句柄,用於存放一個文件唯一標識符。
- SCALAR:存貯結果,如果沒有指定OFFSET,數據將放在SCALAR的開頭。否則數據放在SCALAR中的OFFSET位元組之後。
- LENGTH:讀取的內容長度。
- OFFSET:偏移量。
- 如果讀取成功返回讀取的位元組數,如果在文件結尾返回 0,如果發生錯誤返回 undef。
- print 函數
- 對於所有從文件句柄中讀取信息的函數,在後端主要的寫入函數為 print:
- print FILEHANDLE LIST
- print LIST
- 利用文件句柄和 print 函數可以把程序運行的結果發給輸出設備(STDOUT:標準輸出),例如:
- print "Hello World!n";
- 文件拷貝
- #!/usr/bin/perl
- # 只讀方式打開文件
- open(DATA1, "<file1.txt");
- # 打開新文件並寫入
- open(DATA2, ">file2.txt");
- # 拷貝數據
- while(<DATA1>)
- {
- print DATA2 $_;
- }
- close( DATA1 );
- close( DATA2 );
- 文件重命名
- 以下實例,我們將已存在的文件 file1.txt 重命名為 file2.txt,指定的目錄是在 /usr/runoob/test/ 下:
- rename ("/usr/runoob/test/file1.txt", "/usr/runoob/test/file2.txt" );
- 函數 renames 只接受兩個參數,只對已存在的文件進行重命名。
- 刪除文件
- 以下實例我們演示了如何使用 unlink 函數來刪除文件:
- unlink ("/usr/runoob/test/file1.txt");
- 指定文件位置
- 你可以使用 tell 函數來獲取文件的位置,並通過使用 seek函數來指定文件內的的位置:
- tell 函數
- 用於獲取文件位置:
- tell FILEHANDLE
- 如果指定 FILEHANDLE 該函數返迴文件指針的位置,以位元組計。如果沒有指定則返回默認選取的文件句柄。
- seek 函數
- seek()函數是通過文件句柄來移動文件讀寫指針的方式來讀取或寫入文件的,以位元組為單位進行讀取和寫入:
- seek FILEHANDLE, POSITION, WHENCE
- 參數說明:
- FILEHANDLE:文件句柄,用於存放一個文件唯一標識符。
- POSITION:表示文件句柄(讀寫位置指針)要移動的位元組數。
- WHENCE:表示文件句柄(讀寫位置指針)開始移動時的起始位置,可以取的值為0、1、2;分別表示文件開頭、當前位置和文件尾。
- 以下實例為從文件開頭讀取 256 個位元組:
- seek DATA, 256, 0;
- 文件信息
- Perl 的文件操作也可以先測試文件是否存在,是否可讀寫等。
- 文件測試操作符如下表所示:
- 操作符描述
- -At文件上一次被訪問的時間(單位:天)
- -B 是否為二進位文件
- -C 文件的(inode)索引節點修改時間(單位:天)
- -M 文件上一次被修改的時間(單位:天)
- -O 文件被真實的UID所有
- -R 文件或目錄可以被真實的UID/GID讀取
- -S 為socket(套接字)
- -T 是否為文本文件
- -W 文件或目錄可以被真實的UID/GID寫入
- -X 文件或目錄可以被真實的UID/GID執行
- -b 為block-special (特殊塊)文件(如掛載磁碟)
- -c 為character-special (特殊字元)文件(如I/O 設備)
- -d 為目錄
- -e 文件或目錄名存在
- -f 為普通文件
- -g 文件或目錄具有setgid屬性
- -k 文件或目錄設置了sticky位
- -l 為符號鏈接
- -o 文件被有效UID所有
- -p 文件是命名管道(FIFO)
- -r 文件可以被有效的UID/GID讀取
- -s 文件或目錄存在且不為0(返回位元組數)
- -t 文件句柄為TTY(系統函數isatty()的返回結果;不能對文件名使用這個測試)
- -u 文件或目錄具有setuid屬性
- -w 文件可以被有效的UID/GID寫入
- -x 文件可以被有效的UID/GID執行
- -zt文件存在,大小為0(目錄恆為false),即是否為空文件,
- Perl 目錄操作
- 操作目錄的標準函數:
- opendir DIRHANDLE, EXPR # 打開目錄
- opendir (DIR, .) or die "無法打開目錄, $!";
- foreach (sort grep(/^.*.c$/,readdir(DIR))){
- print "$_n";
- }
- closedir DIR;
- readdir DIRHANDLE # 讀取目錄
- rewinddir DIRHANDLE # 定位指針到開頭
- telldir DIRHANDLE # 返回目錄的當前位置
- seekdir DIRHANDLE, POS # 定位指定到目錄的 POS 位置
- closedir DIRHANDLE # 關閉目錄
- 顯示所有的文件
- 顯示目錄下的所有文件,以下實例使用了glob 操作符,演示如下:
- # 顯示 /tmp 目錄下的所有文件
- $dir = "/tmp/*";
- my @files = glob( $dir );
- foreach (@files ){ print $_ . "n"; }
- 創建一個新目錄
- 刪除目錄
- $dir = "/tmp/perl";
- mkdir( $dir ) or die "無法創建 $dir 目錄, $!";
- 刪除目錄
- rmdir( $dir ) or die "無法刪除 $dir 目錄, $!";
- 切換目錄
- chdir( $dir ) or die "無法切換目錄到 $dir , $!";
推薦閱讀:
※學習perl兩個月感覺還是什麼都不會,怎麼辦?
※為什麼腳本語言GC使用了引用計數法?
※有哪些比較經典的 Perl 入門書籍?
※學Perl還是Python?
※對於學自然語言處理方向的學生來說,學 Perl 好還是學 Python 好?理由是什麼?
