手动方式
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 用于不同的文件编码 - 你总是得到原始字节。