【问题标题】:Perl - file reading - got "GLOB"Perl - 文件读取 - 得到“GLOB”
【发布时间】:2019-11-19 08:29:42
【问题描述】:

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

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 脚本,文件读取工作。” - 那么我们应该如何知道没有问题是什么查看更多代码?

标签: perl


【解决方案1】:

最可能的原因是您忘记了&lt; &gt;

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

基本上,如果您使用&lt;foo&gt;,其中foo 不是美元符号,后面紧跟一个标识符而不是其他任何东西,则它被视为glob 操作,而不是readline

最佳解决方案:

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

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

  1. readline 不像 &lt; &gt; 那样在语法上重载,所以代码是明确的。
  2. readline 告诉您它的作用:读取一行(或行列表)。
  3. 很难不小心省略。

【讨论】:

  • 令人困惑的是,&lt;&gt; 执行的另一个操作是glob(),它与文件句柄使用的GLOB 类型完全无关,尽管它们都像星号。
  • Re "读取一行(或行列表)。",或整个文件,或一个段落,或一个固定大小的块。 (这由$/控制。)
  • @ikegami 是的,你可以重新定义什么是“线”。 :-)
  • @melpomene 我检查了三次我没有忘记&lt;&gt; 标志,但readline 解决了这个问题。谢谢!
  • Re "如果你使用&lt;foo&gt;,其中 foo 不是美元符号,后面紧跟一个标识符,没有别的",&lt;identifier&gt;(没有美元符号) 也是readline
猜你喜欢
  • 2014-12-29
  • 2013-11-14
  • 2017-08-05
  • 2016-06-30
  • 2015-09-14
  • 1970-01-01
  • 2013-07-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多