如何在Perl6中逐行读取gz文件,但是,这种方法将一切内容都读入“:out”,需要的内存太多了,只适用于非常小的文件。
我不明白如何使用Perl6的
Compress::Zlib
逐行获取所有内容,尽管我在其GitHub上开了个问题https://github.com/retupmoca/P6-Compress-Zlib/issues/17我正在尝试使用Perl5的
Compress::Zlib
来转换此代码,在Perl5中完美运行:
use Compress::Zlib;
my $file = "data.txt.gz";
my $gz = gzopen($file, "rb") or die "Error reading $file: $gzerrno";
while ($gz->gzreadline($_) > 0) {
# Process the line read in $_
}
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();
我对 Lib::Archive 的示例https://github.com/frithnanth/perl6-Archive-Libarchive/blob/master/examples/readfile.p6感到困惑,我不知道如何获得类似于这里的第3个项目。
在 Perl6 中应该有像
for $file.IO.lines(gz) -> $line {
或者类似的东西,但是如果存在的话,我找不到它。
在 Perl6 中如何逐行读取大文件而不将所有内容都读入内存?
Inline::Perl5
的问题:对于$gz.gzreadline($_)
的调用,似乎gzreadline
试图通过修改其输入参数$_
(被视为输出参数,但不是真正的 Perl 5 引用变量)来返回从 zip 文件中读取的行,但该值未返回到 Perl 6 脚本。 - Håkon Hæglandgzreadline
函数的更多内容:在 Perl 5 中,您可以修改一个不是引用的输入参数,并且更改将反映在调用者中。这是通过修改特殊的@_
数组变量中的条目来完成的。例如:sub quote { $_[0] = "'$_[0]'" } $str = "Hello"; quote($str)
将引用$str
,即使$str
没有通过引用传递。我不确定Inline::Perl5
是否能够处理这些类型的输出参数。 - Håkon Hæglandarchive_read_data_block()
方法,必须适用于每种存档格式中的每种文件。read-file-content
方法返回一个Buf
中的整个文件。要逐行读取文件,应编写自己的方法使用Archive::Libarchive::Raw
,但我看到有更简单的方法,如您问题的答案所示。 - Fernando Santagata