Perl - 文件I / O.

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

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

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

打开和关闭文件

以下两个函数有多种形式,可用于打开Perl中的任何新文件或现有文件.

open FILEHANDLE, EXPR
open FILEHANDLE

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

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

打开函数

以下是在只读模式下打开 file.txt 的语法.这里小于< sign表示文件必须以只读模式打开.

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的语法.这里小于> sign表示文件必须以书写模式打开.

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

T;或者

只读访问

2

>或者

创建,写入和截断

3

>>或者

写入,追加和创建

4

+<或r +

读写

5

+>或者w +

读取,写入,创建和截断

6

+>>或者a +

读取,写入,追加和创建

Sysopen函数

sysopen 函数类似于主要的open函数,只不过它使用系统 open() function,使用提供给它的参数作为系统函数的参数 :

例如,打开文件进行更新,模拟 +< filename 格式来自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.实体&定义
1

O_RDWR

读写

2

O_RDONLY

只读

3

O_WRONLY

只写

4

O_CREAT

创建文件

5

O_APPEND

追加文件

6

O_TRUNC

截断文件

7

O_EXCL

如果文件已经停止存在

8

O_NONBLOCK

非阻止可用性

关闭功能

关闭af ilehandle,因此解除文件句柄与相应文件的关联,使用关闭功能.这会刷新文件句柄的缓冲区并关闭系统的文件描述符.

close FILEHANDLE
close

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

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

读取和写入文件

打开文件句柄后,您需要能够读取和写入信息.有许多不同的方法可以将数据读入和写入文件.

< FILEHANDL>运算符

从打开的文件句柄中读取信息的主要方法是< FILEHANDLE>运营商.在标量上下文中,它从文件句柄返回一行.例如 :

#!/usr/bin/perl

print "What is your name?\n";
$name = <STDIN>;
print "Hello $name\n";

当您使用< FILEHANDLE>在列表上下文中的运算符,它返回指定文件句柄中的行列表.例如,要将文件中的所有行导入数组 :

#!/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 FILEHANDLE, SCALAR, LENGTH, OFFSET
read FILEHANDLE, SCALAR, LENGTH

读取数据的长度由LENGTH定义,如果未指定OFFSET,则数据放在SCALAR的开头.否则,数据将放在SCALAR中的OFFSET字节之后.该函数返回成功时读取的字节数,文件末尾为零,或者如果有错误则返回undef.

print函数

For用于从文件句柄读取信息的所有不同方法,用于写回信息的主要功能是打印功能.

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 .文本.假设文件在/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 Function

seek函数将文件指针定位到文件中指定的字节数并减去;

seek FILEHANDLE, POSITION, WHENCE

该函数使用fseek系统函数,你有相同的能力相对于三个不同点定位:开始,结束,a当前的位置.您可以通过为WHENCE指定值来执行此操作.

Zero设置相对于文件开头的定位.例如,该行将文件指针设置为文件中的第256个字节.

seek DATA, 256, 0;

文件信息

您可以使用一系列测试运算符在Perl中快速测试某些功能,这些运算符统称为 - X测试.例如,要对文件的各种权限执行快速测试,您可以使用类似于此的脚本;

#/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打开(termi nal)?

23

-u

文件是否设置了setuid位?

24

-w

文件是否可由有效用户或组ID写入?

25

-x

文件是否可由有效用户或组ID执行?

26

-z

文件大小是否为零?