Perl - 文件操作

首页 / Perl入门教程 / Perl - 文件操作

所有文件句柄都能够进行读/写访问,因此您可以读取和更新与文件句柄关联的任何文件或设备。

三个基本文件句柄是-STDIN、STDOUT和分别代表标准输入、标准输出和标准错误设备的STDERR、。

开关文件

open FILEHANDLE, EXPR
open FILEHANDLE

sysopen FILEHANDLE, FILENAME, MODE, PERMS
sysopen FILEHANDLE, FILENAME, MODE

这里,FILEHANDLE是open函数返回的文件句柄,expr是具有文件名和打开文件模式的表达式。

Open 函数

以下是在只读模式下打开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. Entities & Definition
1

<或r

只读访问

2

>或w

创建、写入和截断

3

>>或a

写入、附加和创建

4

+<或r+

读写

5

+>或w+

读取、写入、创建和截断

6

+>>或a+

Reads, 写入、附加和创建

Sysopen函数

sysopen函数与主OPEN函数类似,不同之处在于它使用SYSTEMOPEN()函数,将提供给它的参数用作系统函数−的参数

如,要打开要更新的文件,请从打开的−模拟+格式

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

读写

2

O_RDONLY

只读

3

O_WRONLY

只写

4

O_Creat

创建文件

5

O_Append

追加文件

6

O_TRUNC

截断文件

7

O_EXCL

如果文件已存在,则停止

8

O_NONBLOCK

非阻塞可用性

Close函数

若要关闭文件句柄,从而取消该文件句柄与相应文件的关联,请使用关闭函数。这会刷新filehandle的缓冲区并关闭系统的文件描述符。

close FILEHANDLE
close

如果未指定FILEHANDLE,则关闭当前选定的文件句柄。仅当它能够成功刷新缓冲区并关闭文件时,才返回true。

close(DATA) || die "Couldn't close file properly";

读写文件

一旦你有一个打开的文件句柄,你需要能够读写信息。有许多不同的方法可以将数据读写到文件中。

The <FILEHANDL> Operator

从打开的文件句柄读取信息的主要方法是运算符。在标量上下文中,它从filehandle返回单行。如−

#!/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

如果出现错误,或者filehandle位于文件末尾,则返回undef。

Read 函数

read函数从缓冲的filehandle中读取信息块:该函数用于从文件中读取二进制数据。

read FILEHANDLE, SCALAR, LENGTH, OFFSET
read FILEHANDLE, SCALAR, LENGTH

读取数据的长度由Length定义,如果未指定偏移量,则将数据放在标量的开头。否则,数据将放在标量中的偏移量字节之后。该函数返回成功时读取的字节数,文件结束时为零,如果出现错误则返回undef。

print 函数

对于用于从文件句柄读取信息的所有不同方法,用于写回信息的主要函数是print函数。

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函数了解文件的当前位置,并使用Seek函数指向文件内的特定位置。

Tell 函数

第一个要求是在文件中找到您的位置,这是使用Tell函数−完成的

链接:https://www.learnfk.comhttps://www.learnfk.com/perl/perl-files.html

来源:LearnFk无涯教程网

tell FILEHANDLE
tell

如果指定,则返回文件指针在FILEHANDLE中的位置(以字节为单位);如果未指定,则返回当前默认选定的文件句柄。

Seek 函数

查找函数将文件指针定位到文件−中指定的字节数

seek FILEHANDLE, POSITION, WHENCE

该函数使用fSeek系统函数,并且您具有相对于三个不同点进行定位的相同能力:起点、终点和当前位置。可以通过为WHERE指定一个值来完成此操作。

零设置相对于文件开头的位置。如,该行将文件指针设置为文件中的第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

脚本开始时间减去文件上次访问时间(天)。

2

-B

这是一个二进制文件吗?

3

-C

脚本开始时间减去文件上次信息节点更改时间(天)。

3

-M

脚本开始时间减去文件修改时间(天)。

4

-O

文件是否由真实用户ID拥有?

5

-R

文件是否可由真实用户ID或真实组读取?

6

-S

文件是Socket吗?

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

文件大小为零吗?

祝学习愉快!(内容编辑有误?请选中要编辑内容 -> 右键 -> 修改 -> 提交!)

技术教程推荐

白话法律42讲 -〔周甲徳〕

Go语言从入门到实战 -〔蔡超〕

网络编程实战 -〔盛延敏〕

苏杰的产品创新课 -〔苏杰〕

设计模式之美 -〔王争〕

软件设计之美 -〔郑晔〕

技术面试官识人手册 -〔熊燚(四火)〕

说透数字化转型 -〔付晓岩〕

徐昊 · TDD项目实战70讲 -〔徐昊〕

好记忆不如烂笔头。留下您的足迹吧 :)