Resolvido!
No topo do código onde eu abri o diretório, eu usei "opendir (PDF ..." mas no closedir eu tinha "closedir (DIR ..." que significava que o stream ainda estava aberto). quando fui abrir o arquivo, usei "open (PDF ..." e que já estava aberto, por isso não consegui ler os dados para armazenar no zip.
Ou pelo menos, isso fazia parte do problema. Ainda não parecia gostar de correr de uma sub rotina! No final, eu tive que usar:
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;
E a rotina aberta é agora:
open (PDF, "<....$filename");
while(<PDF>){
$file.=$_;
}
close(PDF);
Isso pode ajudar alguém que obtiver resultados igualmente estranhos!