我正在尝试用Perl6逐行读取gz文件,但是,我被阻止了:
Compress::Zlib
逐行获取所有内容,尽管我在他们的github https://github.com/retupmoca/P6-Compress-Zlib/issues/17
Compress::Zlib
来翻译这段代码,它在Perl5中工作得很好:<代码>G212
使用Compress::Zlib;my $file = "data.txt.gz";my $gz = gzopen($file,"rb")或die "Error reading $file:$gzerrno";while ($gz->gzreadline( $_ ) > 0) {#处理读取$_中的行} die "Error reading $file:$gzerrno“if $gzerrno != Z_STREAM_END;$gz->gzclose();
在Perl6中使用Inline::Perl5
如下所示:
use Compress::Zlib:from<Perl5>;
my $file = 'chrMT.1.vcf.gz';
my $gz = Compress::Zlib::new(gzopen($file, 'r');
while ($gz.gzreadline($_) > 0) {
print $_;
}
$gz.gzclose();
但是我不知道怎么翻译:(
这样的东西
Perl6中的for $file.IO.lines(gz) -> $line {
或类似的东西,如果它存在,我找不到它。
如何逐行读取一个大文件,而不是在Perl6中将所有内容都读入内存?
发布于 2019-02-22 07:03:07
更新现已测试,显示错误,现已修复。
解决方案#2
use Compress::Zlib;
my $file = "data.txt.gz" ;
my $handle = try open $file or die "Error reading $file: $!" ;
my $zwrap = zwrap($handle, :gzip) ;
for $zwrap.lines {
.print
}
CATCH { default { die "Error reading $file: $_" } }
$handle.close ;
我已经用一个小的gzipped文本文件对此进行了测试。
我对gzip等不太了解,但我是基于以下几点得出这个结论的:
Compress::Zlib
's README
并在模块的源代码中选择zwrap
代码,特别是the zwrap
routine routine;our sub zwrap ($thing, :$zlib, :$deflate, :$gzip)
;:gzip
副词。<zwrap
>F217
请评论我的代码是否适合你。我猜最主要的问题是它对于你拥有的大文件是否足够快。
解决方案#5的失败尝试
在解决方案#2有效的情况下,我希望能够编写以下代码:
use Compress::Zlib ;
.print for "data.txt.gz".&zwrap(:gzip).lines ;
但失败的原因是:
No such method 'eof' for invocant of type 'IO::Path'
这可能是因为这个模块是在IO
类重组之前编写的。
这让我找到了@MattOates' issue。我注意到没有响应,我在https://github.com/MattOates?tab=repositories上也没有看到相关的回购。
https://stackoverflow.com/questions/54813782
复制相似问题