首页 > 解决方案 > Perl - 文件读取 - 得到“GLOB”

问题描述

我正在尝试阅读一个简单的文本文件。将整个文件读入数组或仅将第一行读入变量后,当我尝试使用它并打印出值读取文本时,我得到以下结果:

GLOB(0x1234567)

我试图阅读整个文件:

open(my $fh,'<','/path/to/file.txt') or die "Can't open data";
@lines = <$fh>;
close($fh);

print @lines;
#Results in a single "GLOB(0x1234567)" line

或逐行读取文件:

open(my $fh,'<','/path/to/file.txt') or die "Can't open data";
while (my $line = <$fh>) {
    print $line;
    #Results in a single "GLOB(0x1234567)" line
}
close($fh);

该文件具有适当的权限、适当的编码(UTF-8 可以吗?)。

我认为这可能是与环境相关的问题,因为如果我创建一个仅包含上述行的完全空的 Perl 脚本,则文件读取工作正常。

谢谢你的时间!;-)

标签: perl

解决方案


最可能的原因是您忘记了< >

my $line = $fh;   # wrong
my @lines = $fh;  # wrong

更好的:

my $line = <$fh>;   # reads a line
my @lines = <$fh>;  # reads all lines

或者,您可能已经做了以下事情之一:

my $line = <$ fh>;  # parses as glob($fh), not readline($fh)
my $line = <${fh}>;  # also means glob($fh)
my $line = <$handles[$i]>;  # glob($handles[$i])

基本上,如果您使用<foo>wherefoo是除了美元符号之外的任何东西,然后紧跟标识符而不是其他任何东西,则它被视为glob操作,而不是readline.

最佳解决方案:

my $line = readline $fh;
my @lines = readline $fh;

我最喜欢最后一个版本,因为

  1. readline不像< >is 那样在语法上重载,所以代码是明确的。
  2. readline告诉你它做了什么:它读取一行(或行列表)。
  3. 不小心遗漏更难。

推荐阅读