我正在运行以下代码:
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,但无济于事。
答案 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)"
答案 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
块非常有用(并且未充分利用);它们是词汇执行块的好方法,但仍然很容易将内容返回到外部范围。