perl - 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 脚本,则文件读取工作正常。
谢谢你的时间!;-)
解决方案
最可能的原因是您忘记了<
>
:
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;
我最喜欢最后一个版本,因为
readline
不像<
>
is 那样在语法上重载,所以代码是明确的。readline
告诉你它做了什么:它读取一行(或行列表)。- 不小心遗漏更难。
推荐阅读
- php - 在PHP中查找数组中最大值的键
- android - Android Studio Button onClick Listener 不起作用
- group-by - 如何按天计算所有结果
- mysql - ORDER BY 中的索引位置(排名位置)
- opentok - OpenTok/Vonage Video API 中的主要发言人
- javascript - PDF Decoded Base64 PDF 可以用 chrome 和浏览器打开,但不能用 adobe
- amazon-web-services - 在 AWS 路由 53 上购买了一个域,并且该域已注册给其他人
- adsense - 谷歌广告只出现在首页
- python - Vectorize numpy 1D array function that substracts the next element and adds the previous?
- javascript - Chrome 扩展程序 - onAlarm 事件的触发时间比预期的晚