Perl - 文件啜食问题

时间:2012-04-02 15:34:36

标签: perl file-io slurp

我正在运行以下代码:

open my $fh, "<", $file;

$/ = undef;
my $report = <$fh>;
$/ = "\n";

close $fh;

print("$report\n\n");

$ file指的文本文件如下所示:

a    1
b    2
c    3

我在两个不同的Linux机器上运行此代码。其中一个给了我预期的输出(与文本文件中显示的完全相同)。另一个给了我这个:

GLOB(0x80f1174)

...这有效地阻止了我进一步操纵内容。

我检查了Perl版本 - 给我预期输出的是5.10,而另一个是5.8。但是,我已经针对类似的文件执行了完全相同的代码,其中5.8有效。

我也尝试过将文件从DOS转换为UNIX:set ff = unix,但无济于事。

4 个答案:

答案 0 :(得分:4)

损坏的文件不包含

my $report = <$fh>;    # aka: readline($fh)

也许它包含

my $report = $fh;
my $report = < $fh >;  # aka: glob(" $fh ") = " GLOB(0xXXXXXXX) "
my $report = <$fh >;   # aka: glob("$fh ")  = "GLOB(0xXXXXXXX) "
my $report = < $fh>;   # aka: glob(" $fh")  = " GLOB(0xXXXXXXX)"

<>readlineglob的快捷方式(与输出中的单词GLOB无关)。空格使其成为glob

答案 1 :(得分:1)

我建议您只使用CPAN中的File::Slurp模块。然后你的代码看起来像这样:

use File::Slurp 'read_file';
my $file = '/path/to/some/file';
my $report = read_file $file;
print("$report\n\n");

更具可读性和可预测性,IMO。

答案 2 :(得分:0)

是的,写一下

<$fh>

因为$ fh会导致错误,因为$ fh只是文件句柄。打印它将相当于打印参考。如下面的代码,写为FH会导致运行时错误。

open FH,$infile or die$!;
while(<FH>){
    @line=split(/,/);
    if($flag==0){
     foreach my $col (@line){
      $header{$col}=$count;
      $count++;
     }
 }
}
close(FH);

答案 3 :(得分:0)

可以像Hercynium推荐的那样使用File :: Slurp,这个机制更接近OP发布的内容:

my $report = do {
  open my $fh, '<', $file;
  local $/;
  <$fh>;
};

完成此操作后,所有更改都是do块的本地更改,包括关闭文件句柄。

N.B。 perldoc -f do告诉我们

  

做BLOCK

     

不是真正的功能。返回最后一个命令的值   BLOCK指示的命令序列。

请注意,最后执行语句的上下文是do block(此处为标量)的上下文。我发现do块非常有用(并且未充分利用);它们是词汇执行块的好方法,但仍然很容易将内容返回到外部范围。