手动方式

open my $fh, '<', $filename
    or die "Could not open $filename for reading: $!";
my $contents = do { local $/; <$fh> };

打开文件后(如果你想读取特定的文件编码而不是原始字节,请阅读 man perlio),技巧在 do 块中:<$fh>,菱形运算符中的文件句柄,从文件中返回单个记录。 输入记录分隔符变量 $/指定记录是什么 - 默认情况下它被设置为换行符,因此记录表示单行。由于 $/是一个全局变量,local 做了两件事:它创建了 $/的临时本地副本,它将在块的末尾消失,并给它(非)值 undef(Perl 给未初始化的)变量)。当输入记录分隔符具有该(非)值时,菱形运算符将返回整个文件。 (它将整个文件视为一行。)

使用 do,你甚至可以手动打开文件。对于重复阅读文件,

sub readfile { do { local(@ARGV,$/) = $_[0]; <> } }
my $content = readfile($filename);

可以使用。这里,另一个全局变量(@ARGV)被本地化以模拟在使用参数启动 perl 脚本时使用的相同过程。$/仍然是 undef,因为它前面的数组吃掉所有传入的参数。接下来,钻石运算符 <> 再次发送由 $/(整个文件)定义的一条记录,并从 do 块返回,而 do 块又从 sub 返回。

sub 没有明确的错误处理,这是不好的做法! 如果在读取文件时发生错误,你将收到 undef 作为返回值,而不是空文件中的空字符串。

最后一个代码的另一个缺点是你不能将 PerlIO 用于不同的文件编码 - 你总是得到原始字节。