Perl 文件 I/O
Perl 旨在有效地进行文件和 I/O 操作。Perl 的主要优点是文件解析和处理文件。Perl 中的文件处理过程中使用了许多内置函数和运算符。
基本上,使用 Perl 执行的文件操作是使用 FILEHANDLE 完成的。我们必须在打开文件时定义 FILEHANDLE 以进行读取或写入。
Perl 打开文件
我们可以使用 Perl 中提供的 open() 函数打开一个文件。
open(FILEHANDLE, "filename or complete path of the file");
现在我们已经打开了一个文件,现在出现了一个问题。是读还是写?
Perl 读取文件和 Perl 写入文件
Perl 具有某些模式,需要用于读取,写入或追加文件。
Read – open(my $fh,"<filename or complete path of the file"); 
Write – open(my $fh,">filename or complete path of the file");
Append – open(my $fh,">>filename or complete path of the file");
阅读文件的几个例子:
假如我们有一个名为 file.txt 的 Perl 文件,其中包含很少的文本行。我们需要打开这个文件并打印出来。
open(FH,"<file.txt"); 
while(<FH>)    # Looping the file contents using the FH as a filehandle. 
{
    print "$_";
}
close FH;
或者,
open(FH,"<file.txt"); 
my @content=<FH>; # specifying the input of the array is FH.
foreach(@content)
{
    print "$_";
}
close FH;
这将在屏幕上打印文件内容。
现在,我们将编写一个程序来创建和写入 Perl 文件的数据。
open(FH,">test.txt");
my $var=<>;
print FH $var;
close FH;
这将创建一个文件 test.txt 并写入在运行时提供的输入。
上面的方法总是尝试创建一个名为 test.txt 的文件,并将输入写入文件中。我们将编写一段程序来追加文件。
open(FH,">>test.txt");
my $var=<>;
print FH $var;
close FH;
| 模式 | 说明 | 
|---|---|
| < | 阅读 | 
| +< | 读写 | 
| > | 创建,写入和截断 | 
| +> | 读,写,创建和截断 | 
| >> | 写,追加和创建 | 
| +>> | 读,写,追加和创建 | 
现在我们必须看看如何使用基本示例来读取、编写和追加文件。
我们将看到更多示例和其他函数,这些示例和其他函数有助于更多地了解文件。
Perl Tell
如果指定的话,此方法将返回 FILEHANDLER 的当前位置(以字节为单位),否则将最后一行视为位置。
open(FH, "test.pl");
while(<FH>)
{
    $a=tell FH;
    print "$a";
}
Perl Seek
Seek 功能类似于 fseek 系统调用。此方法用于通过指定文件指针的开头或文件指针的结尾之后的字节来将文件指针定位到特定位置。
seek FH, bytes, WHENCE;
WHENCE 是文件指针的开始位置。文件的开头设置为零。
示例:让 input.txt 含有一些数据,例如 Hello this is my world.。
open FH, '+<','input.txt';
seek FH, 5, 0;    # This will start reading data after 5 bytes.
$/= undef;
$out = <FH>;
print $out;
close FH;
输出:
this is my world
Perl Unlink
Unlink 用于删除文件。
unlink("filename or complete file path");
处理目录:
我们还可以处理目录,这样我们就可以处理来多个文件。
让我们看看如何打开目录。我们可以使用 opendir 和 readdir 方法。
opendir(DIR,"C:\\Program Files\\"); #DIR is the directory handler.
while(readdir(DIR)) # loop through the output of readdir to print the directory contents.
{
   print "$_\n";
}
closedir(DIR); #used to close the directory handler.
或者,
opendir(DIR,"C:\\Program Files\\");
@content=readdir(DIR);
foreach(@content)
{
    print "$_\n";
}
closedir(DIR);
这将打印该目录中的所有可用文件。
Perl 文件测试及其含义
| 字符 | 含义 | 
|---|---|
| -r | 检查当前用户/组是否可以读取文件/目录 | 
| -w | 检查当前用户/组的文件/目录是否可写 | 
| -x | 检查文件/目录是否可由当前用户/组执行 | 
| -o | 检查文件/目录是否归当前用户所有 | 
| -R | 检查此真实用户/组的文件/目录是否可读 | 
| -W | 检查此真实用户/组的文件/目录是否可写 | 
| -X | 检查文件/目录是否可由此真实用户/组执行 | 
| -O | 检查文件/目录是否归该真实用户所有 | 
| -e | 检查文件/目录名是否存在 | 
| -z | 检查文件是否存在且大小为零(对于目录始终为 false) | 
| -f | 检查输入是否是普通文件 | 
| -d | 检查输入是否是目录 | 
| -l | 检查输入是否为符号链接 | 
| -S | 检查输入是否是 Socket | 
| -p | 检查输入是否是命名管道( FIFO) | 
| -b | 检查输入是否是块特殊文件(如可安装磁盘) | 
| -c | 检查输入是否是字符特殊文件(如 I/O 设备) | 
| -u | 检查文件或目录是否为 setuid | 
| -g | 检查文件或目录是否为 setgid | 
| -k | 检查文件或目录是否设置了粘滞位 | 
| -t | 给定的文件句柄是一个 TTY(由 isatty()系统函数,文件名无法通过此测试进行测试) | 
| -T | 检查文件是否是 文本文件 | 
| -B | 检查文件是否是 二进制文件 | 
| -M | 检查文件的修改年龄(以天为单位) | 
| -A | 检查文件的访问时限(以天为单位) | 
| -C | 检查文件的 Inode 修改年龄(以天为单位) |