这段Perl代码是否符合它的要求?

One*_*ace 1 perl

在搜索某些内容时,我在这里遇到了这个答案.

我想知道为什么变量$first_line只包含输入文件的第一行.

代码:

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

my $filename = shift;
open my $in_fh, '<', $filename
  or die "Cannot open $filename for reading: $!";
my $first_line = <$in_fh>;

open my $out_fh, '>', "$filename.tmp"
  or die "Cannot open $filename.tmp for writing: $!";

$first_line =~ s/some translation/goes here/;

print {$out_fh} $first_line;
print {$out_fh} $_ while <$in_fh>; # sysread/syswrite is probably better

close $in_fh;
close $out_fh;

# overwrite original with modified copy
rename "$filename.tmp", $filename
  or warn "Failed to move $filename.tmp to $filename: $!";
Run Code Online (Sandbox Code Playgroud)

据我所知,整个内容$in_fh都存储在$first_line.

Rob*_*sen 7

表达式<FH>将在标量上下文中使用时返回文件的第一行,如果在列表上下文中使用,则返回文件的完整内容:

my $first_line = <FH>;
my @lines = <FH>;
Run Code Online (Sandbox Code Playgroud)

原因是,默认情况下,内置输入记录separator($/)被定义为换行符.如果要重新定义或取消定义记录分隔符,可以将整个文件粘贴到标量变量中:

undef $/;
my $lines = <FH>;
Run Code Online (Sandbox Code Playgroud)

但是,请注意全局重新定义Perl内置变量的风险.您可以使用local它仅将其应用于当前范围.

local $/;
my $lines = <FH>;
Run Code Online (Sandbox Code Playgroud)

关于PerlMonks帖子建议这个习惯用法限制取消定义的范围$/:

my $lines = do { local $/; <FH> };
Run Code Online (Sandbox Code Playgroud)