文件操作 #
一、打开文件 #
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