我正在使用以下内容将文件读入SCALAR
open FILE, "<", $filename or error_out("Error opening $filename");
read FILE, my $buffer, -s $filename;
close FILE;
我不确定如何考虑“新”$buffer
/ SCALAR
类型。它是一个字符串?数组?如何逐行完成?
答案 0 :(得分:6)
首先,我建议您使用以下内容来阅读文件:
my $buffer = do {
open(my $fh, '<', $filename)
or error_out("Error opening $filename: $!");
local $/;
<$fh>
};
请注意删除无用且可能不正确的-s
。注意对文件句柄使用词法变量而不是全局变量。请注意在错误消息中包含基础错误消息。
变量是标量。该值为字符串。
for my $line (split(/^/m, $buffer)) {
...
}
但为什么不一次只读一行。
open(my $fh, '<', $filename)
or error_out("Error opening $filename: $!");
while (my $line = <$fh>) {
...
}
答案 1 :(得分:3)
for my $line (split(/\n/, $buffer)
{
# do whatever with $line
}
或者,如果您没有特别依赖于将整个文件一次性读入内存:
open(FILE, "<", $filename) or error_out("Error opening $filename");
while (<FILE>)
{
# do whatever with $_
}
close(FILE);
答案 2 :(得分:2)
在Perl程序中使用read
是不常见的。大多数情况下readline FILE
(或等效的<FILE>
)更合适。
如果您不需要同时在内存中存储整个文件,则可以使用
迭代这些行while (my $line = <FILE>) {
# Process $line
}
或者如果您希望将整个文件放在一个行数组中,那么您可以执行
my @lines = <FILE>;
将整个文件读入单个字符串的常规方法是取消定义$/
- 输入文件分隔符 - 就像这样
local $/;
my $contents = <FILE>;
但这通常远比前两个选项有用。