Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Read&;在gzip文件中查找Perl_Perl_Buffer - Fatal编程技术网

Read&;在gzip文件中查找Perl

Read&;在gzip文件中查找Perl,perl,buffer,Perl,Buffer,我试图读取给定的一组gzip/plain xml文件,并根据给定的偏移量和长度值将这些文件的某些部分打印成输出xml文件 偏移值是哈希%offhash的键,对应的键是长度 这是我用来生成输出文件的函数- sub fileproc { my $infile = shift; my $outfile = shift; my $FILEH; $| = 1; $outfile =~ s/.gz$//; if($infile =~ m/\.gz$/i){

我试图读取给定的一组gzip/plain xml文件,并根据给定的偏移量和长度值将这些文件的某些部分打印成输出xml文件

偏移值是哈希%offhash的键,对应的键是长度

这是我用来生成输出文件的函数-

sub fileproc {
   my $infile = shift;
   my $outfile = shift;
   my $FILEH;
   $| = 1;
    $outfile =~ s/.gz$//;
   if($infile =~ m/\.gz$/i){
       open( $FILEH,"gunzip -c $infile | ") or die "Could not open input $infile";
   }
   else{
       open( $FILEH, "<", $infile) or die "Could not open input $infile";
   }

   open(my $OUTH, ">", $outfile) or die "Couldn't open file, $!";
   foreach my $offset (sort{$a <=> $b} keys %offhash)
   {
       my $record="";
       seek ($FILEH, $offset, 0);
       read ($FILEH, $record, $offhash{$offset}, 0);
       print $OUTH "$record";
   }
    close $FILEH;
    close $OUTH;
}
有人能帮我解决这个问题吗


提前感谢。

您只能在常规文件中查找,而不能在程序或STDIN等的输出中查找。如果您想这样做,您需要自己添加一个缓冲层,但请注意,您可能需要缓冲整个未压缩文件,以便能够在其中查找


即使您不使用外部程序压缩,但使用IO::Gzip之类的东西,您也无法查找,因为Gzip(和其他压缩)的固有工作方式是,您需要读取所有以前的数据,以便能够在当前文件位置解压缩数据。有很多方法可以限制以前需要的数据量,但是接下来需要专门准备gzip文件,它会变得更大。我不知道目前有哪个模块实现了这个功能,但我做过一次概念验证,所以我知道它是有效的。

这个文件处理程序是由
open($FILEH,“gunzip-c$infle |”)给出的吗
可以查看吗?顺便说一句,我认为使用Perl模块(如)是解决问题的更好方法。
tell
在流上工作。只要你只需要
seek
forward,你就可以在
tell
read
方面模拟
seek
。感谢Steffen,我知道在IO::Gzip中还没有seek函数,这就是为什么要在pipe中尝试它的原因。Seek在我只使用一个gz文件作为输入时工作,但在使用多个输入文件时出现问题。。现在我知道为什么了…感谢暴民们在这里帮助我。我是你的忠实粉丝。。告诉和阅读的结合代替了寻找作品!!虽然我不确定这是否和seek一样快,但它没有seek那么快,也不可能。正如我所说,要获得压缩文件中的后期数据,需要先解压缩所有数据(这是读取所做的),而这肯定没有设置新文件位置那么快。
open( $FILEH,"gunzip -c $infile | ") or die "Could not open input $infile";