在搜索某些内容时,我在这里遇到了这个答案.
我想知道为什么变量$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: $!";
据我所知,整个内容$in_fh都存储在$first_line.
表达式<FH>将在标量上下文中使用时返回文件的第一行,如果在列表上下文中使用,则返回文件的完整内容:
my $first_line = <FH>;
my @lines = <FH>;
原因是,默认情况下,内置输入记录separator($/)被定义为换行符.如果要重新定义或取消定义记录分隔符,可以将整个文件粘贴到标量变量中:
undef $/;
my $lines = <FH>;
但是,请注意全局重新定义Perl内置变量的风险.您可以使用local它仅将其应用于当前范围.
local $/;
my $lines = <FH>;
关于PerlMonks的帖子建议这个习惯用法限制取消定义的范围$/:
my $lines = do { local $/; <FH> };