File I/O
处理文件的基础很简单:将filehandle与外部实体(通常是文件)相关联,然后使用Perl中的各种运算符和函数来读取和更新与文件句柄关联的数据流中存储的数据。
文件句柄是一个命名的内部Perl结构,它将物理文件与名称相关联。 所有文件句柄都具有读/写访问权限,因此您可以读取和更新与文件句柄关联的任何文件或设备。 但是,关联文件句柄时,可以指定打开文件句柄的模式。
三个基本文件句柄是 - STDIN , STDOUT和STDERR,分别代表标准输入,标准输出和标准错误设备。
打开和关闭文件 (Opening and Closing Files)
以下两个函数具有多个表单,可用于在Perl中打开任何新文件或现有文件。
open FILEHANDLE, EXPR
open FILEHANDLE
sysopen FILEHANDLE, FILENAME, MODE, PERMS
sysopen FILEHANDLE, FILENAME, MODE
这里FILEHANDLE是open函数返回的文件句柄,EXPR是具有文件名和打开文件模式的表达式。
打开功能
以下是以只读模式打开file.txt的语法。 这里小于“符号表示文件必须以只读模式打开。
open(DATA, "<file.txt");
这里DATA是文件句柄,用于读取文件。 这是一个示例,它将打开一个文件并在屏幕上打印其内容。
#!/usr/bin/perl
open(DATA, "<file.txt") or die "Couldn't open file file.txt, $!";
while(<DATA>) {
print "$_";
}
以下是在写入模式下打开file.txt的语法。 这里小于>符号表示文件必须在写入模式下打开。
open(DATA, ">file.txt") or die "Couldn't open file file.txt, $!";
此示例实际上在打开文件之前截断(清空)文件,这可能不是所需的效果。 如果要打开文件进行读写,可以在>或
例如,要打开文件进行更新而不截断它 -
open(DATA, "+<file.txt"); or die "Couldn't open file 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, $!";
以下是表格,其中给出了不同模式的可能值
Sr.No. | 实体和定义 |
---|---|
1 | 《 or r 只读访问权限 |
2 | 》 or w 创建,写入和截断 |
3 | 》》 or a 写入,追加和创建 |
4 | +《 or r+ 读写 |
5 | +》 or w+ 读,写,创建和截断 |
6 | +》》 or a+ 读,写,追加和创建 |
Sysopen功能
sysopen函数类似于main open函数,除了它使用系统open()函数,使用提供给它的参数作为系统函数的参数 -
例如,要打开文件进行更新,请从打开模拟+《filename格式 -
sysopen(DATA, "file.txt", O_RDWR);
或者在更新之前截断文件 -
sysopen(DATA, "file.txt", O_RDWR|O_TRUNC );
您可以使用O_CREAT创建新文件,使用O_WRONLY-以只写模式打开文件,使用O_RDONLY - 以只读模式打开文件。
PERMS参数指定指定文件的文件权限(如果必须创建)。 默认情况下,它需要0x666 。
以下是表格,其中给出了MODE的可能值。
Sr.No. | 实体和定义 |
---|---|
1 | O_RDWR 读和写 |
2 | O_RDONLY 只读 |
3 | O_WRONLY 只写 |
4 | O_CREAT 创建文件 |
5 | O_APPEND 附加文件 |
6 | O_TRUNC 截断文件 |
7 | O_EXCL 如果文件已存在则停止 |
8 | O_NONBLOCK 非阻塞可用性 |
关闭功能
要关闭文件句柄,从而取消文件句柄与相应文件的关联,可以使用close函数。 这会刷新文件句柄的缓冲区并关闭系统的文件描述符。
close FILEHANDLE
close
如果未指定FILEHANDLE,则它将关闭当前选定的文件句柄。 仅当它可以成功刷新缓冲区并关闭文件时,它才返回true。
close(DATA) || die "Couldn't close file properly";
读写文件 (Reading and Writing Files)
一旦打开文件句柄,您就需要能够读取和写入信息。 有许多不同的方法可以将数据读入和写入文件。
运算符
从打开的文件句柄读取信息的主要方法是运算符。 在标量上下文中,它从文件句柄返回一行。 例如 -
#!/usr/bin/perl
print "What is your name?\n";
$name = <STDIN>;
print "Hello $name\n";
在列表上下文中使用运算符时,它将返回指定文件句柄中的行列表。 例如,要将文件中的所有行导入数组 -
#!/usr/bin/perl
open(DATA,"<import.txt") or die "Can't open data";
@lines = <DATA>;
close(DATA);
getc功能
getc函数返回指定FILEHANDLE中的单个字符,如果没有指定则返回STDIN -
getc FILEHANDLE
getc
如果出现错误,或文件句柄位于文件末尾,则返回undef。
读功能
read函数从缓冲的文件句柄中读取一个信息块:该函数用于从文件中读取二进制数据。
read FILEHANDLE, SCALAR, LENGTH, OFFSET
read FILEHANDLE, SCALAR, LENGTH
读取数据的长度由LENGTH定义,如果未指定OFFSET,则数据放在SCALAR的开头。 否则,数据将放在SCALAR中的OFFSET字节之后。 该函数返回成功时读取的字节数,文件末尾为零,如果有错误则返回undef。
打印功能
对于用于从文件句柄读取信息的所有不同方法,用于写回信息的主要功能是打印功能。
print FILEHANDLE LIST
print LIST
print
print函数将LIST的评估值打印到FILEHANDLE,或打印到当前输出文件句柄(默认情况下为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" );
此函数renames需要两个参数,它只是重命名现有文件。
删除现有文件
下面是一个示例,演示如何使用unlink函数删除文件file1.txt。
#!/usr/bin/perl
unlink ("/usr/test/file1.txt");
在文件中定位
您可以使用tell函数来了解文件的当前位置,并使用函数来指向文件中的特定位置。
告诉功能
第一个要求是在文件中找到你的位置,你使用tell函数来做 -
tell FILEHANDLE
tell
如果指定,则返回文件指针的位置(以字节为单位)在FILEHANDLE中,如果未指定,则返回当前默认选择的文件句柄。
寻求功能
seek函数将文件指针定位到文件中指定的字节数 -
seek FILEHANDLE, POSITION, WHENCE
该函数使用fseek系统函数,您可以相对于三个不同的点进行定位:开始,结束和当前位置。 您可以通过为WHENCE指定值来完成此操作。
零设置相对于文件开头的定位。 例如,该行将文件指针设置为文件中的第256个字节。
seek DATA, 256, 0;
文件信息
您可以使用一系列统称为-X测试的测试运算符在Perl中快速测试某些功能。 例如,要快速测试文件的各种权限,可以使用这样的脚本 -
#/usr/bin/perl
my $file = "/usr/test/file1.txt";
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 _);
push @description, 'executable' if (-x _);
push @description, (($size = -s _)) ? "$size bytes" : 'empty';
print "$file is ", join(', ',@description),"\n";
}
以下是功能列表,您可以检查文件或目录 -
Sr.No. | 运算符和定义 |
---|---|
1 | -A 脚本开始时间减去文件上次访问时间,以天为单位。 |
2 | -B 它是二进制文件吗? |
3 | -C 脚本开始时间减去文件的最后一个inode更改时间,以天为单位。 |
3 | -M 脚本开始时间减去文件修改时间,以天为单位。 |
4 | -O 该文件是否由真实用户ID拥有? |
5 | -R 文件是否可由真实用户ID或真实组读取? |
6 | -S 该文件是一个套接字? |
7 | -T 它是文本文件吗? |
8 | -W 文件是否可由真实用户ID或真实组写入? |
9 | -X 文件是否可以由真实用户ID或真实组执行? |
10 | -b 它是块特殊文件吗? |
11 | -c 它是一个字符特殊文件吗? |
12 | -d 该文件是目录吗? |
13 | -e 该文件是否存在? |
14 | -f 它是普通文件吗? |
15 | -g 该文件是否设置了setgid位? |
16 | -k 文件是否设置了粘滞位? |
17 | -l 该文件是一个符号链接? |
18 | -o 该文件是否由有效用户ID拥有? |
19 | -p 该文件是命名管道吗? |
20 | -r 文件是否可被有效用户或组ID读取? |
21 | -s 返回文件的大小,零大小=空文件。 |
22 | -t 文件句柄是否由TTY(终端)打开? |
23 | -u 该文件是否设置了setuid位? |
24 | -w 文件是否可由有效用户或组ID写入? |
25 | -x 文件是否可由有效用户或组ID执行? |
26 | -z 文件大小是否为零? |