所有文件句柄都能够进行读/写访问,因此您可以读取和更新与文件句柄关联的任何文件或设备。
三个基本文件句柄是-STDIN、STDOUT和分别代表标准输入、标准输出和标准错误设备的STDERR、。
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. | Entities & Definition |
---|---|
1 |
<或r 只读访问 |
2 |
>或w 创建、写入和截断 |
3 |
>>或a 写入、附加和创建 |
4 |
+<或r+ 读写 |
5 |
+>或w+ 读取、写入、创建和截断 |
6 |
+>>或a+ Reads, 写入、附加和创建 |
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 非阻塞可用性 |
若要关闭文件句柄,从而取消该文件句柄与相应文件的关联,请使用关闭函数。这会刷新filehandle的缓冲区并关闭系统的文件描述符。
close FILEHANDLE
close
如果未指定FILEHANDLE,则关闭当前选定的文件句柄。仅当它能够成功刷新缓冲区并关闭文件时,才返回true。
close(DATA) || die "Couldn't close file properly";
一旦你有一个打开的文件句柄,你需要能够读写信息。有许多不同的方法可以将数据读写到文件中。
从打开的文件句柄读取信息的主要方法是
#!/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函数从指定的FILEHANDLE中返回单个字符,如果没有指定−,则返回STDIN
getc FILEHANDLE
getc
如果出现错误,或者filehandle位于文件末尾,则返回undef。
read函数从缓冲的filehandle中读取信息块:该函数用于从文件中读取二进制数据。
read FILEHANDLE, SCALAR, LENGTH, OFFSET read FILEHANDLE, SCALAR, LENGTH
读取数据的长度由Length定义,如果未指定偏移量,则将数据放在标量的开头。否则,数据将放在标量中的偏移量字节之后。该函数返回成功时读取的字节数,文件结束时为零,如果出现错误则返回undef。
对于用于从文件句柄读取信息的所有不同方法,用于写回信息的主要函数是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函数−完成的
链接:https://www.learnfk.comhttps://www.learnfk.com/perl/perl-files.html
来源:LearnFk无涯教程网
tell FILEHANDLE
tell
如果指定,则返回文件指针在FILEHANDLE中的位置(以字节为单位);如果未指定,则返回当前默认选定的文件句柄。
查找函数将文件指针定位到文件−中指定的字节数
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 文件大小为零吗? |
祝学习愉快!(内容编辑有误?请选中要编辑内容 -> 右键 -> 修改 -> 提交!)