【发布时间】:2015-06-13 08:49:09
【问题描述】:
如何在 perl 中流式传输一个 50GB 的大文件来为每一行(或块)执行一些正则表达式?我试过普通香草
for $line (<FH>) {
# do regex
}
我也尝试过 Tie::File 和 File::Stream,但 perl 总是试图将整个文件加载到内存中,这根本不可能。
#!/usr/bin/perl
use IO::Handle;
use Tie::File;
use File::Stream;
#tie @array, 'Tie::File', $ARGV[0] or die "could not open file";
STDOUT->autoflush(1);
$file=$ARGV[0];
open(INFO, "< $file") or die("Could not open file.");
print "opening ... \n";
my $stream = File::Stream->new(<INFO>);
#$out = $ARGV[1];
#open(my $OH, '>', $out) or die "Could not open file '$out' $!";
print "starting ... \n";
while (<$stream>) {
$line = $_;
$line =~ s/\n/\[!BR!\]/g;
$line =~ s/<page>/\n<page>/g;
$line =~ s/<\/page>/<\/page>\n/g;
print $line;
#STDOUT->flush();
}
close(INFO);
【问题讨论】:
-
您是否查看过此页面:perlmonks.org/?node_id=956620?
open my $filehandle, '<', 'myfile.txt'; my $line_number = 0; while (defined($line = <$filehandle>)) { ... }(cmets 中没有换行符,抱歉 :() -
@stribizhev 不,但你说得对:
open my $filehandle, '<', 'myfile.txt'; while (defined($line = <$filehandle>)) {...}