【问题标题】:Does this piece of Perl code do what it says?这段 Perl 代码是否按照它所说的那样做?
【发布时间】:2016-04-11 11:59:30
【问题描述】:

在搜索东西时,我遇到了这个答案here

我想知道为什么变量$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中。

【问题讨论】:

    标签: perl


    【解决方案1】:

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

    my $first_line = <FH>;
    my @lines = <FH>;
    

    这样做的原因是,默认情况下,内置输入记录分隔符 ($/) 被定义为换行符。如果您要重新定义或取消定义记录分隔符,您可以将整个文件放入一个标量变量中:

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

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

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

    post on PerlMonks 建议使用此成语来限制未定义 $/ 的范围:

    my $lines = do { local $/; <FH> };
    

    【讨论】:

      【解决方案2】:

      在代码中,my $first_line 是标量上下文。在标量上下文中,&lt;$in_fh&gt; 读取并返回一行。

      在数组上下文中,&lt;$in_fh&gt; 将读取所有行(或内存不足):

      my @all_lines = <$in_fh>;
      

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

      【讨论】:

        猜你喜欢
        • 2013-12-28
        • 1970-01-01
        • 2013-04-01
        • 2010-09-14
        • 2019-01-06
        • 2016-01-09
        • 1970-01-01
        • 2015-07-07
        • 1970-01-01
        相关资源
        最近更新 更多