📅  最后修改于: 2020-11-02 03:41:34             🧑  作者: Mango
处理文件的基础很简单:将文件句柄与外部实体(通常是文件)相关联,然后在Perl中使用各种运算符和函数来读取和更新存储在与文件句柄关联的数据流中的数据。
文件句柄是将物理文件与名称关联的命名内部Perl结构。所有文件句柄都具有读/写访问能力,因此您可以读取和更新与该文件句柄关联的任何文件或设备。但是,在关联文件句柄时,可以指定打开文件句柄的模式。
三个基本文件句柄-STDIN , STDOUT和STDERR,分别代表标准输入,标准输出和标准错误设备。
以下两个函数具有多种形式,可用于在Perl中打开任何新文件或现有文件。
open FILEHANDLE, EXPR
open FILEHANDLE
sysopen FILEHANDLE, FILENAME, MODE, PERMS
sysopen FILEHANDLE, FILENAME, MODE
FILEHANDLE是打开函数返回的文件句柄,EXPR是具有文件名和打开文件模式的表达式。
以下是在只读模式下打开file.txt的语法。此处小于<符号表示必须以只读模式打开文件。
open(DATA, "
DATA是文件句柄,将用于读取文件。这是示例,它将打开一个文件并在屏幕上打印其内容。
#!/usr/bin/perl
open(DATA, ") {
print "$_";
}
以下是在写入模式下打开file.txt的语法。此处小于>符号表示必须在写入模式下打开文件。
open(DATA, ">file.txt") or die "Couldn't open file file.txt, $!";
本示例实际上在打开文件进行写入之前将其截断(清空),这可能不是理想的效果。如果要打开文件进行读写,可以在>或<字符前加一个加号。
例如,打开文件以进行更新而不截断-
open(DATA, "+
首先截断文件-
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. | Entities & Definition |
---|---|
1 |
< or r Read Only Access |
2 |
> or w Creates, Writes, and Truncates |
3 |
>> or a Writes, Appends, and Creates |
4 |
+< or r+ Reads and Writes |
5 |
+> or w+ Reads, Writes, Creates, and Truncates |
6 |
+>> or a+ Reads, Writes, Appends, and Creates |
sysopen函数与main open函数类似,不同之处在于它使用system open()函数,并使用提供给它的参数作为system函数的参数-
例如,要打开文件进行更新,请从open模拟+
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. | Entities & Definition |
---|---|
1 |
O_RDWR Read and Write |
2 |
O_RDONLY Read Only |
3 |
O_WRONLY Write Only |
4 |
O_CREAT Create the file |
5 |
O_APPEND Append the file |
6 |
O_TRUNC Truncate the file |
7 |
O_EXCL Stops if file already exists |
8 |
O_NONBLOCK Non-Blocking usability |
要关闭文件句柄,从而使文件句柄与相应的文件解除关联,请使用close函数。这将刷新文件句柄的缓冲区并关闭系统的文件描述符。
close FILEHANDLE
close
如果未指定FILEHANDLE,则它将关闭当前选择的文件句柄。仅当它可以成功刷新缓冲区并关闭文件时,它才返回true。
close(DATA) || die "Couldn't close file properly";
拥有打开的文件句柄后,您需要能够读取和写入信息。有多种不同的方式将数据读取和写入文件。
从打开的文件句柄读取信息的主要方法是
#!/usr/bin/perl
print "What is your name?\n";
$name = ;
print "Hello $name\n";
在列表上下文中使用
#!/usr/bin/perl
open(DATA,";
close(DATA);
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
打印函数将LIST的评估值打印到FILEHANDLE或当前输出文件句柄(默认为STDOUT)。例如-
print "Hello World!\n";
这是示例,该示例打开一个现有文件file1.txt并逐行读取并生成另一个副本文件file2.txt。
#!/usr/bin/perl
# Open file to read
open(DATA1, "file2.txt");
# Copy data from one file to another.
while() {
print DATA2 $_;
}
close( DATA1 );
close( DATA2 );
这是一个示例,显示了如何将文件file1.txt重命名为file2.txt。假设文件在/ usr / test目录中可用。
#!/usr/bin/perl
rename ("/usr/test/file1.txt", "/usr/test/file2.txt" );
重命名此函数有两个参数,它只是重命名现有文件。
这是一个示例,显示了如何使用取消链接函数删除文件file1.txt。
#!/usr/bin/perl
unlink ("/usr/test/file1.txt");
您可以使用告诉函数来了解文件的当前位置,并使用查找函数来指向文件内的特定位置。
首先要求是找到您在文件中的位置,您可以使用tell函数-
tell FILEHANDLE
tell
如果指定,则返回文件指针在FILEHANDLE中的位置(以字节为单位),如果未指定,则返回当前默认选择的文件句柄。
搜寻函数将文件指针定位到文件中指定数量的字节-
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. | Operator & Definition |
---|---|
1 |
-A Script start time minus file last access time, in days. |
2 |
-B Is it a binary file? |
3 |
-C Script start time minus file last inode change time, in days. |
3 |
-M Script start time minus file modification time, in days. |
4 |
-O Is the file owned by the real user ID? |
5 |
-R Is the file readable by the real user ID or real group? |
6 |
-S Is the file a socket? |
7 |
-T Is it a text file? |
8 |
-W Is the file writable by the real user ID or real group? |
9 |
-X Is the file executable by the real user ID or real group? |
10 |
-b Is it a block special file? |
11 |
-c Is it a character special file? |
12 |
-d Is the file a directory? |
13 |
-e Does the file exist? |
14 |
-f Is it a plain file? |
15 |
-g Does the file have the setgid bit set? |
16 |
-k Does the file have the sticky bit set? |
17 |
-l Is the file a symbolic link? |
18 |
-o Is the file owned by the effective user ID? |
19 |
-p Is the file a named pipe? |
20 |
-r Is the file readable by the effective user or group ID? |
21 |
-s Returns the size of the file, zero size = empty file. |
22 |
-t Is the filehandle opened by a TTY (terminal)? |
23 |
-u Does the file have the setuid bit set? |
24 |
-w Is the file writable by the effective user or group ID? |
25 |
-x Is the file executable by the effective user or group ID? |
26 |
-z Is the file size zero? |