上一节:
下一节:

  Perl 文件 I/O



  • 文件 I/O

    处理文件的基础很简单:将文件句柄与外部实体(通常是文件)相关联,然后在 Perl 中使用各种运算符和函数来读取和更新存储在与文件句柄关联的数据流中的数据。文件句柄是将物理文件与名称关联的命名内部Perl结构。所有文件句柄都具有读/写访问能力,因此您可以读取和更新与该文件句柄关联的任何文件或设备。但是,在关联文件句柄时,可以指定打开文件句柄的模式。
    三个基本文件句柄- STDINSTDOUTSTDERR,分别代表标准输入,标准输出和标准错误设备。
  • 打开和关闭文件

    以下两个函数具有多种形式,可用于在Perl中打开任何新文件或现有文件。
    
    open FILEHANDLE, EXPR
    open FILEHANDLE
    
    sysopen FILEHANDLE, FILENAME, MODE, PERMS
    sysopen FILEHANDLE, FILENAME, MODE
    
    
    FILEHANDLE是打开函数返回的文件句柄,EXPR是具有文件名和打开文件模式的表达式。
  • open 函数

    以下是在只读模式下打开file.txt的语法。此处小于 < 符号表示必须以只读模式打开文件。
    
    open(DATA, "<file.txt");
    
    
    DATA是文件句柄,将用于读取文件。这是示例,它将打开一个文件并在屏幕上打印其内容。
    
    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, $!";
    
    
    下表是提供不同模式可能的值的表
    实体 定义
    <或r 只读访问
    >或w 创建,写入和截断
    >>或> 编写,附加和创建
    +<或r+ 读写
    +>或w+ 读取,写入,创建和截断
    +>>或a+ 读取,写入,附加和创建
  • sysopen 函数

    sysopen 函数类似于 open 函数,不同之处在于它使用系统的 open() 函数,利用提供给它作为系统函数的参数的参数-
    例如,要打开文件进行更新,从open 模拟+<filename格式-
    
    sysopen(DATA, "file.txt", O_RDWR);
    
    
    或者在更新之前截断文件-
    
    sysopen(DATA, "file.txt", O_RDWR|O_TRUNC );
    
    
    您可以使用O_CREAT创建一个新文件,并使用O_WRONLY-以只写模式打开文件,使用O_RDONLY-以只读模式打开文件。
    PERMS参数指定的文件权限指定的文件,如果它被创建。默认情况下,它取0x666。
    下表是给出MODE可能值的表格。
    实体 定义
    O_RDWR 读和写
    O_RDONLY 只读
    O_WRONLY 只写
    O_CREAT 创建文件
    O_APPEND 追加文件
    O_TRUNC 截断文件
    O_EXCL 如果文件已经存在则停止
    O_NONBLOCK 非阻塞可用性
  • cloose 函数

    要关闭文件句柄,从而使文件句柄与相应的文件解除关联,请使用close函数。这将刷新文件句柄的缓冲区并关闭系统的文件描述符。
    
    close FILEHANDLE
    close
    
    
    如果未指定 FILEHANDLE,则它将关闭当前选择的文件句柄。仅当它可以成功刷新缓冲区并关闭文件时,它才返回true。
    
    close(DATA) || die "Couldn't close file properly";
    
    
  • 读写文件

    拥有打开的文件句柄后,您需要能够读取和写入信息。有多种不同的方式将数据读取和写入文件。
  • <FILEHANDL> 运算符

    从打开的文件句柄读取信息的主要方法是<FILEHANDLE>运算符。在标量上下文中,它从文件句柄返回一行。例如-
    
    print "What is your name?\n";
    $name = <STDIN>
    print "Hello $name\n";
    
    
    在列表上下文中使用 <FILEHANDLE> 运算符时,它将返回来自指定文件句柄的行列表。例如,要将文件中的所有行导入到数组中-
    
    open(DATA,"<import.txt") or die "Can't open data";
    @lines = <DATA>;
    close(DATA);
    
    
  • getc 函数

    getc 函数从指定的FILEHANDLE中返回单个字符,如果未指定则返回STDIN-
    
    getc FILEHANDLE
    getc
    
    
    如果出现错误,或者文件句柄位于文件末尾,则返回undef
  • read 函数

    read 函数从缓冲的文件句柄中读取信息块:此函数用于从文件中读取二进制数据。
    
    read FILEHANDLE, SCALAR, LENGTH, OFFSET
    read FILEHANDLE, SCALAR, LENGTH
    
    
    读取的数据长度由LENGTH定义,如果未指定OFFSET,则将数据放置在SCALAR的开头。否则,数据将放在SCALAR中的OFFSET字节之后。该函数返回成功读取的字节数,文件末尾为零,如果出现错误,则返回undef。
  • print 函数

    对于从文件句柄读取信息的所有不同方法,写回信息的主要函数是print 函数。
    
    print FILEHANDLE LIST
    print LIST
    print
    
    
    print 函数将LIST的评估值打印到FILEHANDLE或当前输出文件句柄(默认为STDOUT)。例如-
    
    print "Hello World!\n";
    
    
  • 复制文件

    这是示例,该示例打开一个现有文件file1.txt并逐行读取并生成另一个副本文件file2.txt。
    
    # 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目录中可用。
    
    rename ("/usr/test/file1.txt", "/usr/test/file2.txt" );
    
    
    重命名此函数有两个参数,它只是重命名现有文件。
  • 删除现有文件

    这是一个示例,显示了如何使用取消链接功能删除文件file1.txt 。
    
    unlink ("/usr/test/file1.txt");
    
    
  • 在文件内定位

    您可以用来告诉函数知道文件的当前位置,并可以查找函数来指向文件内的特定位置。
    tell 函数
    首先要求是找到您在文件中的位置,您可以使用tell函数-
    
    tell FILEHANDLE
    tell
    
    
    如果指定,则返回文件指针在FILEHANDLE中的位置(以字节为单位),如果未指定,则返回当前默认选择的文件句柄。
    seek 函数
    搜寻功能将文件指针定位到文件中指定数量的字节-
    
    seek FILEHANDLE, POSITION, WHENCE
    
    
    该函数使用fseek系统函数,并且您具有相对于三个不同点进行定位的相同能力:起点,终点和当前位置。为此,您可以为WHENCE指定一个值。零设置相对于文件开始的位置。例如,该行将文件指针设置为文件中的第256个字节。
    
    seek DATA, 256, 0;
    
    
    s
  • 文件信息

    您可以使用一系列称为-X测试的测试运算符在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";
    }
    
    
    这是功能列表,您可以检查文件或目录-
    操作符 描述
    -A 脚本开始时间减去文件上次访问时间(以天为单位)。
    -B 它是二进制文件吗?
    -C 脚本开始时间减去文件最后一个inode更改时间(以天为单位)。
    -M 脚本开始时间减去文件修改时间(以天为单位)。
    -O 文件由真实用户ID拥有吗?
    -R 真实用户ID或真实组可以读取文件吗?
    -S 该文件是套接字吗?
    -T 它是文本文件吗?
    -W 该文件可以由真实用户ID或真实组写入吗?
    -X 该文件可以通过真实用户ID或真实组执行吗?
    -b 它是块特殊文件吗?
    -c 它是字符特殊文件吗?
    -d 该文件是目录吗?
    -e 该文件存在吗?
    -f 它是纯文件吗?
    -g 文件中是否设置了setgid位?
    -k 文件是否设置了粘性位?
    -l 该文件是符号链接吗?
    -o 文件是否归有效用户标识所有?
    -p 该文件是命名管道吗?
    -r 有效用户或组ID可以读取文件吗?
    -s 返回文件的大小,零大小=空文件。
    -t 文件句柄是否由TTY(终端)打开?
    -u 该文件是否设置了setuid位?
    -w 该文件可以由有效的用户或组ID写入吗?
    -x 该文件是否可以通过有效的用户或组ID执行?
    -z 文件大小为零吗?
上一节:
下一节: