-2

我正在运行以下代码:

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 对类似文件执行了完全相同的代码。

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

4

4 回答 4

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)"

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

于 2012-04-02T16:05:16.490 回答
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 更具可读性和可预测性。

于 2012-04-03T02:36:25.750 回答
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);
于 2012-04-02T15:58:37.180 回答
0

可以按照 Hercynium 的建议使用 File::Slurp,该机制更接近于 OP 发布的机制:

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

以这种方式完成后,所有更改都是do块的本地更改,包括关闭文件句柄。

NBperldoc -f do告诉我们

做块

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

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

于 2012-04-03T04:39:56.270 回答