Blame examples/zipGrep.pl

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