diff options
Diffstat (limited to 'examples/zipGrep.pl')
-rw-r--r-- | examples/zipGrep.pl | 52 |
1 files changed, 52 insertions, 0 deletions
diff --git a/examples/zipGrep.pl b/examples/zipGrep.pl new file mode 100644 index 0000000..b9f07b8 --- /dev/null +++ b/examples/zipGrep.pl @@ -0,0 +1,52 @@ +#!/usr/bin/perl -w +# This program searches for the given Perl regular expression in a Zip archive. +# Archive is assumed to contain text files. +# By Ned Konz, perl@bike-nomad.com +# Usage: +# perl zipGrep.pl 'pattern' myZip.zip +# +use strict; +use Archive::Zip qw(:CONSTANTS :ERROR_CODES); + +if (@ARGV != 2) { + print <<EOF; +This program searches for the given Perl regular expression in a Zip archive. +Archive is assumed to contain text files. +Usage: + perl $0 'pattern' myZip.zip +EOF + exit 1; +} + +my $pattern = shift; +$pattern = qr{$pattern}; # compile the regular expression +my $zipName = shift; + +my $zip = Archive::Zip->new(); +if ($zip->read($zipName) != AZ_OK) { + die "Read error reading $zipName\n"; +} + +foreach my $member ($zip->members()) { + my ($bufferRef, $status, $lastChunk); + my $memberName = $member->fileName(); + my $lineNumber = 1; + $lastChunk = ''; + $member->desiredCompressionMethod(COMPRESSION_STORED); + $status = $member->rewindData(); + die "rewind error $status" if $status != AZ_OK; + + while (!$member->readIsDone()) { + ($bufferRef, $status) = $member->readChunk(); + die "readChunk error $status" + if $status != AZ_OK && $status != AZ_STREAM_END; + + my $buffer = $lastChunk . $$bufferRef; + while ($buffer =~ m{(.*$pattern.*\n)}mg) { + print "$memberName:$1"; + } + ($lastChunk) = $$bufferRef =~ m{([^\n\r]+)\z}; + } + + $member->endRead(); +} |