当输入文件是.gz文件时,有啥方法可以在perl中使用seek函数[关闭]

Posted

技术标签:

【中文标题】当输入文件是.gz文件时,有啥方法可以在perl中使用seek函数[关闭]【英文标题】:Is there any way to use seek funtion in perl when an input file is a .gz file [closed]当输入文件是.gz文件时,有什么方法可以在perl中使用seek函数[关闭] 【发布时间】:2020-10-19 12:37:32 【问题描述】:

我一直在尝试在输入文件为 .gz 格式的 Perl 脚本中使用 seek 函数。我使用以下命令集打开了文件

if ($ARGV[0] =~ /.gz$/) 
open (FH1, "gunzip -c $ARGV[0] |") || die ("cant open file");

else open (FH1, "<$ARGV[0]") || die ("cannot open file");

当seek函数用于普通文本文件时,它工作正常,如果是给一个.gz文件,因为输入seek函数不能正常工作。

在这种情况下,除了在使用 seek 的地方关闭和打开文件之外,seek 函数还有其他选择吗

【问题讨论】:

你说的是seek吗?在 any 管道流中向后查找将是困难的 :-) 我建议将其解压缩到一个临时文件中并打开它。 不可能找到.gz 流中的特定点。这是 gzip 格式的固有限制;另见here。您可以做的最好的事情是从头开始并丢弃字节直到到达目的地,或者解压缩整个内容(到内存或磁盘上)并在那里进行随机访问。 【参考方案1】:

核心 IO::Uncompress::Gunzip 模块在用于读取 gzip 压缩文件时对 seek 的支持有限(而不是像您正在做的那样使用外部程序):

提供查找功能的子集,但限制是在输入文件/缓冲区中向前查找是合法的。尝试向后搜索是一个致命错误。

请注意,此模块中的 seek 实现不提供对压缩文件/缓冲区的真正随机访问。它的工作原理是从文件/缓冲区中的当前偏移量解压缩数据,直到达到要查找的参数中指定的未压缩偏移量。对于非常小的文件,这可能是可接受的行为。对于大文件,它可能会导致无法接受的延迟。

【讨论】:

以上是关于当输入文件是.gz文件时,有啥方法可以在perl中使用seek函数[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

Perl | Perl读取gzip压缩文件

使用 perl 提取 tar.gz 文件时内存不足

xampp中的perl文件夹有啥用,为啥它包含在xampp中? [关闭]

在 perl 中提取 tar.gz 文件

使用 foreach 或在 Perl 中迭代文件有啥区别?

tar包和tar.gz包有啥区别