这段Perl代码是按照它说的做的吗?

这段Perl代码是按照它说的做的吗?,perl,Perl,在寻找某样东西时,我偶然发现了这个答案 我想知道为什么变量$first\u 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, '&

在寻找某样东西时,我偶然发现了这个答案

我想知道为什么变量
$first\u 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: $!";
#/usr/bin/env perl
严格使用;
我的$filename=shift;
打开我的$in_fh,,“$filename.tmp”
或“无法打开$filename.tmp进行写入:$!”;
$first_line=~s/一些翻译/转到这里/;
打印{$out\u fh}$第一行;
打印{$out_fh}$\uwhile;#sysread/syswrite可能更好
以欧元结算美元;
关闭$OFH;
#用修改后的副本覆盖原件
重命名“$filename.tmp”,$filename
或警告“未能将$filename.tmp移动到$filename:$!”;
据我所知,在标量上下文中使用时,表达式
将返回文件的第一行,如果在列表上下文中使用,则返回文件的完整内容:

my $first_line = <FH>;
my @lines = <FH>;
但是,要注意全局重新定义Perl内置变量的风险。您可以使用
local
将其仅应用于当前范围

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

my $first_line = <FH>;
my @lines = <FH>;
但是,要注意全局重新定义Perl内置变量的风险。您可以使用
local
将其仅应用于当前范围

local $/;
my $lines = <FH>;

在代码中,
my$first\u行
是标量上下文。在标量上下文中,
读取并返回一行

在数组上下文中,
将读取所有行(或耗尽内存):

my@all_line=;

上下文在Perl中是一个非常重要的概念,也是一个微妙的概念。

在代码中,
我的$first\u行
是标量上下文。在标量上下文中,
读取并返回一行

在数组上下文中,
将读取所有行(或耗尽内存):

my@all_line=;
上下文在Perl中是一个非常重要的概念,也是一个微妙的概念

my @all_lines = <$in_fh>;