当输入文件是.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函数[关闭]的主要内容,如果未能解决你的问题,请参考以下文章