处理文件的基本原理很简单:你关联与外部实体(通常是文件)的文件句柄,然后使用各种在Perl的运算符和函数内与句柄相关联的数据流中存储的数据读取和更新。
一个句柄是一个名为Perl的内部结构,关联物理文件名称。所有的文件句柄是读/写访问,所以你可以读取和更新与句柄相关联的任何文件或设备的能力。然而,当你关联的文件句柄,你可以在被打开的文件句柄指定的模式。
三个基本文件的句柄是:STDIN, STDOUT 和 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 "$_"; }
以下是语法打开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函数是主要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 FILEHANDLE close
如果没有指定的文件句柄(FILEHANDLE)的话关闭当前选择的文件句柄。只有当它能够成功地刷新缓冲区并关闭该文件,它返回true。
close(DATA) || die "Couldn't close file properly";
当你有一个打开文件句柄,你需要能够读取和写入信息。也有一些不同的方式读取和写入文件的数据。
从一个打开文件句柄读取信息的主要方法是<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函数返回从指定的文件句柄或STDIN,如果没有指定一个单一的字符:
getc FILEHANDLE getc
如果有错误,或者文件句柄在文件的末尾,然后返回UNDEF。
read函数读取缓冲句柄的信息块:该函数用于从文件中读取的二进制数据。
read FILEHANDLE, SCALAR, LENGTH, OFFSET read FILEHANDLE, SCALAR, LENGTH
数据读取的长度定义的长度(LENGTH),如果没有偏移指定的数据放置在标量(SCALAR)开始。否则,数据将被放置在标量抵消后的字节。该函数返回零上读取文件结束成功的字节数,或者undef如果有一个错误。
写入信息反馈的主要功能是为所有不同的方法用于从文件句柄读取信息的打印功能。
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 FILEHANDLE tell
这将返回文件指针的位置,以字节为单位,如果没有指定,在句柄指定或当前的默认选中的文件句柄,
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 函数。