2016-04-11 36 views
1

在尋找東西時,我碰到了這個答案here這段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: $!"; 

據我所知,的$in_fh的全部內容存儲在$first_line

回答

7

表達<FH>或者返回時,它在標量上下文,或該文件的全部內容被用於該文件的第一行,如果在列表中上下文中使用:

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> }; 
4

在代碼中,my $first_line是標量上下文。在標量環境下,<$in_fh>會讀取並返回一行。

在陣列方面,<$in_fh>會閱讀所有線路(或運行內存不足):

my @all_lines = <$in_fh>; 

語境是Perl中的一個非常重要的概念 - 和一個微妙的概念,太。