Perl Archive::Zip 奇怪的响应

Perl Archive::Zip 奇怪的响应

这确实让我很困惑:这段代码运行良好......

$filename="name_of_file.pdf";

for ($x=0; $x<@pdf; $x++){
$file.=$pdf[$x];
}
$file=~s/\*ref\*/$new_aff/g;    # converts a variable within the PDF

use Archive::Zip qw( :ERROR_CODES :CONSTANTS );
my $zip = Archive::Zip->new(); 
$now=time();
$save_zip=$now.".zip";
my $member = $zip->addString($file,$filename);
$member->desiredCompressionMethod( COMPRESSION_DEFLATED );
$member->desiredCompressionLevel( 9 );
die 'write error' unless $zip->writeToFileNamed($save_zip) == AZ_OK;

open (FILE, "<$save_zip");
flock(FILE,2);
binmode(FILE);
    while(<FILE>){
    $infile.=$_;
    }
flock(FILE,8);
close (FILE);

unlink($save_zip);
$filename=~s/\.pdf/\.zip/;


print "Content-type: application/zip\n";
print "Content-disposition: inline;filename=\"$filename\"\n\n";
print $infile;

文件被读入并存储在@pdf中。然后将其转换为文件而不是数组。然后将其添加到zip并保存。然后再次读入并打印到屏幕上以打开保存对话框。(好吧,编码有点“不确定”,但可以节省处理流等的时间,我对此一无所知!)

现在我实际上在做同样的事情,但是我读取的不是单个文件名,而是目录,然后调用子程序...

opendir(PDF, "../data/viral/");
@pdfDir=readdir(PDF);
closedir(DIR);
@pdfDir=grep(!/^\./, @pdfDir);
@pdfDir=grep(!/\.txt/, @pdfDir);

use Archive::Zip qw( :ERROR_CODES :CONSTANTS );
my $zip = Archive::Zip->new(); 
$now=time();
$save_zip=$now.".zip";

for ($x=0; $x<@pdfDir; $x++){
 &process_all;
 }
die 'write error' unless $zip->writeToFileNamed($save_zip) == AZ_OK;  # Write file out once loop finished

sub process_all{    # Processs all the PDF's
&open_pdf;          # Read in as BINMODE
    for ($z=0; $z<@pdf; $z++){
    $file.=$pdf[$z];
    }
$file=~s/\*ref\*/$new_aff/g;    # converts a variable within the PDF

my $member = $zip->addString($file,$pdfDir[$x]);
$member->desiredCompressionMethod( COMPRESSION_DEFLATED );
$member->desiredCompressionLevel( 9 );
$file="";   # Empty the file ready for next PDF
}

但是它抱怨说“无法在未定义的值上调用方法“addString””但文件名显示是正确的,并且如果我打印到屏幕,pdf 就会被转换为文件。

我在 $x 循环内和子程序中尝试了 $filename=$pdf[$x]。两者都显示了正确的文件名,但都无法避免错误。

它很可能就在我眼前——但我却看不到它!

答案1

解决了!

在我打开目录的代码顶部,我使用了“opendir(PDF...”,但在 closedir 上我使用了“closedir(DIR ...”,这意味着流仍然打开。然后 - 当我打开文件时,我使用了“open(PDF ...”,但它已经打开了,所以无法读取要存储在 zip 中的数据。

或者至少,这是问题的一部分。它似乎仍然不喜欢从子程序运行!最后,我不得不使用:

use Archive::Zip qw( :ERROR_CODES :CONSTANTS );
$zip = Archive::Zip->new(); 
$now=time();
$save_zip=$now.".zip";

for ($x=0; $x<@pdfDir; $x++){
$filename=$pdfDir[$x];
&open_pdf;
$file=~s/\*ref\*/$new_aff/g;
$member = $zip->addString($file,$filename);
$member->desiredCompressionMethod( COMPRESSION_DEFLATED );
$member->desiredCompressionLevel( 9 );
$file="";
}
die 'write error' unless $zip->writeToFileNamed($save_zip) == AZ_OK;

现在开放的例程是:

open (PDF, "<....$filename");
while(<PDF>){
$file.=$_;
}
close(PDF);

这可能会对那些得到类似奇怪结果的人有所帮助!

相关内容