summaryrefslogtreecommitdiff
path: root/examples/zipGrep.pl
diff options
context:
space:
mode:
Diffstat (limited to 'examples/zipGrep.pl')
-rw-r--r--examples/zipGrep.pl52
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();
+}