📜  Perl-文件I / O

📅  最后修改于: 2020-11-02 03:41:34             🧑  作者: Mango


处理文件的基础很简单:将文件句柄与外部实体(通常是文件)相关联,然后在Perl中使用各种运算符和函数来读取和更新存储在与文件句柄关联的数据流中的数据。

文件句柄是将物理文件与名称关联的命名内部Perl结构。所有文件句柄都具有读/写访问能力,因此您可以读取和更新与该文件句柄关联的任何文件或设备。但是,在关联文件句柄时,可以指定打开文件句柄的模式。

三个基本文件句柄-STDINSTDOUTSTDERR,分别代表标准输入,标准输出和标准错误设备。

打开和关闭文件

以下两个函数具有多种形式,可用于在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功能

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函数

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?