use Archive::Zip; use Archive::Zip::MemberRead; opendir(DIR, "$ARGV[0]") || die "Can't open the '' directory"; @dr = grep(/\.zip/, readdir(DIR)); closedir(DIR); undef $/; foreach $ZipFilName (sort @dr) { my %ZipCnt = &Zip_XmlCount($ARGV[0]."\\".$ZipFilName); #### my required output print "$ZipCnt{'xml'}\t$ZipCnt{'pdf'}\t$ZipCnt{'title'}\n"; #### } sub Zip_XmlCount { my ($zipfile, $pdfCnt, $xmlCnt, %zipcnt) = @_; my $zip = Archive::Zip->new(); die "can't read '$zipfile' file" unless $zip->read($zipfile) eq 0; for($zip->memberNames()) { $xmlCnt++ if ($_ =~ /\.xml/is); # xml count $pdfCnt++ if ($_ =~ /\.pdf/is); # pdf count ########### problematic code $fh = new Archive::Zip::MemberRead($zipfile, "./$zpname"); while (defined($line = $fh->getline())) { $line =~ /(.+)<\/article-title>/g; # article-title inside xml file $title = $1; } ########### } $xmlCnt ||=0; $pdfCnt ||=0; $zipcnt{'xml'} = $xmlCnt; $zipcnt{'pdf'} = $pdfCnt; $zipcnt{'title'} = $title; return %zipcnt; }