[英]How to use SCALAR to read line-by-line after reading in a large file (Perl) ?
我正在使用以下方式将文件读入SCALAR
:
open FILE, "<", $filename or error_out("Error opening $filename");
read FILE, my $buffer, -s $filename;
close FILE;
我不确定如何考虑“新的” $buffer
/ SCALAR
类型。 是字符串吗? 数组? 如何逐行处理?
首先,建议您使用以下内容读取文件:
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>) { ... }
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);
在Perl程序中使用read
是不寻常的。 通常, readline FILE
(或等效的<FILE>
)更合适。
如果您不需要一次将整个文件存储在内存中,则可以使用
while (my $line = <FILE>) {
# Process $line
}
或者,如果您希望将整个文件排列成一行,则可以
my @lines = <FILE>;
将整个文件读取为单个字符串的常规方法是取消定义$/
-输入文件分隔符-像这样
local $/;
my $contents = <FILE>;
但这通常没有前两个选项有用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.