文件操作 #

一、打开文件 #

1.1 三参数open(推荐) #

perl
open my $fh, "<", "input.txt" or die "Cannot open: $!";
open my $fh, ">", "output.txt" or die "Cannot open: $!";
open my $fh, ">>", "append.txt" or die "Cannot open: $!";
open my $fh, "+<", "readwrite.txt" or die "Cannot open: $!";

1.2 模式说明 #

模式 说明
< 只读
> 只写(覆盖)
>> 追加
+< 读写
+> 读写(先清空)

1.3 编码指定 #

perl
open my $fh, "<:encoding(UTF-8)", "input.txt" or die $!;
open my $fh, ">:encoding(UTF-8)", "output.txt" or die $!;

1.4 自动关闭 #

使用词法文件句柄,作用域结束时自动关闭:

perl
{
    open my $fh, "<", "file.txt" or die $!;
    
}

1.5 手动关闭 #

perl
open my $fh, "<", "file.txt" or die $!;
close $fh;

二、读取文件 #

2.1 逐行读取 #

perl
open my $fh, "<", "file.txt" or die $!;

while (my $line = <$fh>) {
    chomp $line;
    print $line . "\n";
}

close $fh;

2.2 读取所有行 #

perl
open my $fh, "<", "file.txt" or die $!;
my @lines = <$fh>;
close $fh;

print $_ foreach @lines;

2.3 读取整个文件 #

perl
open my $fh, "<", "file.txt" or die $!;

local $/;
my $content = <$fh>;

close $fh;
print $content;

或使用 File::Slurp

perl
use File::Slurp;

my $content = read_file("file.txt");
my @lines = read_file("file.txt", chomp => 1);

2.4 读取固定长度 #

perl
open my $fh, "<", "file.txt" or die $!;

my $buffer;
while (read $fh, $buffer, 1024) {
    print $buffer;
}

close $fh;

三、写入文件 #

3.1 写入字符串 #

perl
open my $fh, ">", "output.txt" or die $!;
print $fh "Hello, World!\n";
close $fh;

3.2 写入多行 #

perl
open my $fh, ">", "output.txt" or die $!;
print $fh "Line 1\n";
print $fh "Line 2\n";
print $fh "Line 3\n";
close $fh;

3.3 写入数组 #

perl
my @lines = ("Line 1", "Line 2", "Line 3");

open my $fh, ">", "output.txt" or die $!;
print $fh "$_\n" foreach @lines;
close $fh;

3.4 追加内容 #

perl
open my $fh, ">>", "log.txt" or die $!;
print $fh "New log entry\n";
close $fh;

3.5 使用say #

perl
use v5.10;

open my $fh, ">", "output.txt" or die $!;
say $fh "Hello, World!";
say $fh "Another line";
close $fh;

四、文件测试 #

4.1 常用测试符 #

测试符 说明
-e 存在
-f 普通文件
-d 目录
-r 可读
-w 可写
-x 可执行
-s 文件大小
-M 修改天数
-A 访问天数
-T 文本文件
-B 二进制文件

4.2 使用示例 #

perl
my $file = "test.txt";

if (-e $file) {
    print "File exists\n";
    
    if (-f $file) {
        print "Regular file\n";
        print "Size: " . (-s $file) . " bytes\n";
    }
    
    if (-r $file && -w $file) {
        print "Readable and writable\n";
    }
}

4.3 批量测试 #

perl
my $file = "test.txt";

if (-f $file && -r _) {
    print "Readable file\n";
}

五、文件信息 #

5.1 stat函数 #

perl
my @stat = stat("file.txt");

my $dev = $stat[0];
my $ino = $stat[1];
my $mode = $stat[2];
my $nlink = $stat[3];
my $uid = $stat[4];
my $gid = $stat[5];
my $size = $stat[7];
my $atime = $stat[8];
my $mtime = $stat[9];
my $ctime = $stat[10];

5.2 使用哈希 #

perl
use File::stat;

my $st = stat("file.txt");
print "Size: " . $st->size . "\n";
print "Mode: " . $st->mode . "\n";
print "Mtime: " . $st->mtime . "\n";

六、文件操作函数 #

6.1 重命名 #

perl
rename "old.txt", "new.txt" or die "Cannot rename: $!";

6.2 删除 #

perl
unlink "file.txt" or die "Cannot delete: $!";

unlink @files;

6.3 复制 #

perl
use File::Copy;

copy "source.txt", "dest.txt" or die "Copy failed: $!";
move "old.txt", "new.txt" or die "Move failed: $!";

6.4 截断 #

perl
truncate "file.txt", 0 or die "Cannot truncate: $!";

七、实践练习 #

练习1:文件复制 #

perl
#!/usr/bin/perl
use strict;
use warnings;

my ($src, $dst) = @ARGV;
die "Usage: $0 <source> <dest>\n" unless $src && $dst;

open my $in, "<", $src or die "Cannot open $src: $!";
open my $out, ">", $dst or die "Cannot open $dst: $!";

local $/;
print $out <$in>;

close $in;
close $out;

print "Copied $src to $dst\n";

练习2:行号添加 #

perl
#!/usr/bin/perl
use strict;
use warnings;
use v5.10;

my $file = $ARGV[0] or die "Usage: $0 <file>\n";
open my $fh, "<", $file or die "Cannot open $file: $!";

my $line_num = 1;
while (my $line = <$fh>) {
    printf "%5d: %s", $line_num++, $line;
}

close $fh;

练习3:日志分析 #

perl
#!/usr/bin/perl
use strict;
use warnings;
use v5.10;

my $logfile = $ARGV[0] or die "Usage: $0 <logfile>\n";
open my $fh, "<", $logfile or die "Cannot open $logfile: $!";

my %counts;

while (my $line = <$fh>) {
    if ($line =~ /ERROR/) {
        $counts{error}++;
    } elsif ($line =~ /WARN/) {
        $counts{warn}++;
    } elsif ($line =~ /INFO/) {
        $counts{info}++;
    }
}

close $fh;

say "Log Analysis:";
say "  Errors: $counts{error}";
say "  Warnings: $counts{warn}";
say "  Info: $counts{info}";

八、总结 #

本章学习了:

  • 打开和关闭文件
  • 读取文件(逐行、全部)
  • 写入文件
  • 文件测试
  • 文件操作函数

下一章将学习目录操作。

最后更新:2026-03-27