这确实让我很困惑:这段代码运行良好......
$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);
这可能会对那些得到类似奇怪结果的人有所帮助!