當前位置:首頁 » Perl » Perl文件I/O

Perl文件I/O

Perl文件I/O操作符,讀寫文件,修改文件,目錄操作,實例,使用例子 教學,

處理文件的基本原理很簡單:你關聯與外部實體(通常是文件)的文件句柄,然後使用各種在Perl的運算符和函數內與句柄相關聯的數據流中存儲的數據讀取和更新。

一個句柄是一個名為Perl的內部結構,關聯物理文件名稱。所有的文件句柄是讀/寫訪問,所以你可以讀取和更新與句柄相關聯的任何文件或設備的能力。然而,當你關聯的文件句柄,你可以在被打開的文件句柄指定的模式。

三個基本文件的句柄是:STDINSTDOUT 和 STDERR.

打開和關閉文件

Per有以下兩個函數以及多形式可以用來打開任何新的或現有的文件。

open FILEHANDLE, EXPR
open FILEHANDLE
sysopen FILEHANDLE, FILENAME, MODE, PERMS
sysopen FILEHANDLE, FILENAME, MODE

這裡的FILEHANDLE是由open函數返回的文件句柄和expr是打開文件的文件名和模式的表達式。

以下是語法在隻讀模式打開file.txt的。這裡比<signe少表明該文件是隻讀模式打開

open(DATA, "<file.txt");

這裡DATA將用於讀取文件的文件句柄。下麵的例子,這將打開一個文件,將其內容打印在屏幕上。

#!/usr/bin/perl

open(DATA, "<file.txt");

while(<DATA>)
{
   print "$_";
}

Open函數

以下是語法打開file.txt寫入模式。這裡比>signe少表示該文件是以寫入模式打開。

open(DATA, ">file.txt");

這個例子實際上截斷(清空)文件打開前用於寫入,這可能不是預期的效果。如果你想打開一個文件進行讀取和寫入,你可以把前一個加號>或<字符。

例如,要為更新打開一個文件而不會截斷它:

open(DATA, "+<file.txt");

首先要截斷該文件:

open DATA, "+>file.txt" or die "Couldn't open file file.txt, $!";

您可以在追加模式打開一個文件。在這種模式下寫入指向將被設置到文件的末尾。

open(DATA,">>file.txt") || die "Couldn't open file file.txt, $!";

雙重>>符號表示打開追加文件,文件指針放置在結尾,讓你可以立即開始追加信息。然而,你不能讀取它,除非你也將在它前麵的加號:

open(DATA,"+>>file.txt") || die "Couldn't open file file.txt, $!";

以下是表了不同模式的可能值:

Entities	Definition < or r		Read Only Access - by www.gitbook.net
> or w		Creates, Writes, and Truncates
>> or a		Writes, Appends, and Creates
+< or r+	Reads and Writes
+> or w+	Reads, Writes, Creates, and Truncates
+>> or a+	Reads, Writes, Appends, and Creates

Sysopen函數

sysopen函數是主要open函數相似,但它使用係統open()函數,使用係統函數的參數提供給它的參數:

例如,要打開一個文件用於更新,從打開模擬+<文件名格式:

sysopen(DATA, "file.txt", O_RDWR);

或截斷,然後再更新文件:

sysopen(DATA, "file.txt", O_RDWR|O_TRUNC );

您可以使用O_CREAT創建一個新文件,O_WRONLY隻寫模式和O_RDONLY打開文件 - 打開文件在隻讀模式。

PERMS 參數指定指定的文件的權限,如果它要創建,默認情況下是0x666

Value		Definition O_RDWR		Read and Write
O_RDONLY	Read Only
O_WRONLY	Write Only
O_CREAT		Create the file
O_APPEND	Append the file
O_TRUNC		Truncate the file
O_EXCL		Stops if file already exists
O_NONBLOCK	Non-Blocking usability

Close函數

要關閉一個文件句柄,因此脫離了相應的文件句柄,你使用close函數刷新文件句柄的緩衝和關閉係統的文件描述符。

close FILEHANDLE
close

如果冇有指定的文件句柄(FILEHANDLE)的話關閉當前選擇的文件句柄。隻有當它能夠成功地刷新緩衝區並關閉該文件,它返回true。

close(DATA) || die "Couldn't close file properly";

讀取和寫入的文件句柄

當你有一個打開文件句柄,你需要能夠讀取和寫入信息。也有一些不同的方式讀取和寫入文件的數據。

<FILEHANDL> 操作符

從一個打開文件句柄讀取信息的主要方法是<FILEHANDLE>操作符,在標量上下文中,它返回一個文件句柄一行。例如:

#!/usr/bin/perl

print "What is your name?\n";
$name = <STDIN>;
print "Hello $name\n";

當您使用<FILEHANDLE>操作符在一個列表上下文,它返回從指定的文件句柄的行列表。例如,導入到一個數組從一個文件的所有行:

#!/usr/bin/perl

open(DATA,"<import.txt") or die "Can't open data";
@lines = <DATA>;
close(DATA);

getc函數

getc函數返回從指定的文件句柄或STDIN,如果冇有指定一個單一的字符:

getc FILEHANDLE
getc

如果有錯誤,或者文件句柄在文件的末尾,然後返回UNDEF。

read函數

read函數讀取緩衝句柄的信息塊:該函數用於從文件中讀取的二進製數據。

read FILEHANDLE, SCALAR, LENGTH, OFFSET
read FILEHANDLE, SCALAR, LENGTH

數據讀取的長度定義的長度(LENGTH),如果冇有偏移指定的數據放置在標量(SCALAR)開始。否則,數據將被放置在標量抵消後的字節。該函數返回零上讀取文件結束成功的字節數,或者undef如果有一個錯誤。

print函數

寫入信息反饋的主要功能是為所有不同的方法用於從文件句柄讀取信息的打印功能。

print FILEHANDLE LIST
print LIST
print

打印功能打印文件句柄,或當前輸出句柄(默認為STDOUT),計算值列表。例如:

print "Hello World!\n";

拷貝文件

這裡是例如打開一個現有的文件file1.txt和讀取一行行,並生成另一個副本file2.txt

#!/usr/bin/perl

# Open file to read
open(DATA1, "<file1.txt");

# Open new file to write
open(DATA2, ">file2.txt");

# Copy data from one file to another.
while(<DATA1>)
{
   print DATA2 $_;
}
close( DATA1 );
close( DATA2 );

重命名一個文件

下麵是一個例子,它告訴我們如何重命名一個文件file1.txt為file2.txt。假設文件在/usr/test目錄。

#!/usr/bin/perl

rename ("/usr/test/file1.txt", "/usr/test/file2.txt" );

這個函數重命名需要兩個參數,它隻是重命名現有文件

刪除一已存在的文件

下麵是一個例子,它展示了如何使用的unlink函數刪除一個文件file1.txt。

#!/usr/bin/perl

unlink ("/usr/test/file1.txt");

定位文件中位置

你可以用它來tell 函數知道一個文件的當前位置,seek 函數指向內部文件的特定位置。 

tell 函數

第一個要求是在一個文件中,你使用TELL函數找到位置:

tell FILEHANDLE
tell

這將返回文件指針的位置,以字節為單位,如果冇有指定,在句柄指定或當前的默認選中的文件句柄,

seek 函數

seek 尋求函數定位文件指針到指定的數字在一個文件中的字節:

seek FILEHANDLE, POSITION, WHENCE

該函數使用的fseek係統的功能,有同樣的相對位置功能,以三個不同點:開始,結束,當前位置。您可以通過指定一個值自何處(WHENCE)。

零設置相對定位文件開始。例如,該行設置文件指針在256個字節的文件。

seek DATA, 256, 0;

獲取文件信息

你可以測試在Perl中的某些功能使用統稱為 - X測試的一係列測試運營商非常快速。

例如,進行快速測試的各種文件的權限,你可能會使用這樣的腳本:

#/usr/bin/perl

my (@description,$size);
if (-e $file)
{
   push @description, 'binary' if (-B _);
   push @description, 'a socket' if (-S _);
   push @description, 'a text file' if (-T _);
   push @description, 'a block special file' if (-b _);
   push @description, 'a character special file' if (-c _);
   push @description, 'a directory' if (-d _); # by www.gitbook.net
   push @description, 'executable' if (-x _);
   push @description, (($size = -s _)) ? "$size bytes" : 'empty';
   print "$file is ", join(', ',@description),"\n";
}

這裡是功能列表,你可以檢查文件

Operator Description -A 	Age of file (at script startup) in days since modification.
-B 	Is it a binary file?
-C 	Age of file (at script startup) in days since modification.
-M 	Age of file (at script startup) in days since modification.
-O 	Is the file owned by the real user ID?
-R 	Is the file readable by the real user ID or real group?
-S 	Is the file a socket?
-T 	Is it a text file?
-W 	Is the file writable by the real user ID or real group?
-X 	Is the file executable by the real user ID or real group?
-b 	Is it a block special file?
-c 	Is it a character special file?
-d 	Is the file a directory?
-e 	Does the file exist?
-f 	Is it a plain file? # by www.gitbook.net
-g 	Does the file have the setgid bit set?
-k 	Does the file have the sticky bit set?
-l 	Is the file a symbolic link?
-o 	Is the file owned by the effective user ID?
-p 	Is the file a named pipe?
-r 	Is the file readable by the effective user or group ID?
-s 	Returns the size of the file, zero size = empty file. 
-t 	Is the filehandle opened by a TTY (terminal)?
-u 	Does the file have the setuid bit set?
-w 	Is the file writable by the effective user or group ID?
-x 	Is the file executable by the effective user or group ID?
-z 	Is the file size zero?

在目錄中工作

以下是通常操作目錄的標準功能。

opendir DIRHANDLE, EXPR  # To open a directory
readdir DIRHANDLE        # To read a directory
rewinddir DIRHANDLE      # Positioning pointer to the begining
telldir DIRHANDLE        # Returns current position of the dir
seekdir DIRHANDLE, POS   # Pointing pointer to POS inside dir
closedir DIRHANDLE       # Closing a directory.

下麵是一個例子,它打開一個目錄,並列出此目錄內的所有文件。

#!/usr/bin/perl

opendir (DIR, '.') or die "Couldn't open directory, $!";
while ($file = readdir DIR)
{
  print "$file\n";
}
closedir DIR;

另一個例子,打印C源代碼文件列表,您可以使用:

#!/usr/bin/perl

opendir(DIR, '.') or die "Couldn't open directory, $!";
foreach (sort grep(/^.*\.c$/,readdir(DIR)))
{
   print "$_\n";
}
closedir DIR;

你可以創建一個新的目錄,使用mkdir 函數:

你可以刪除一個目錄,使用rmdir 函數

你可以改變一個目錄,使用chdir 函數。