Debian lenny version packages
[pkg-perl] / deb-src / libarchive-zip-perl / libarchive-zip-perl-1.18 / examples / zipGrep.pl
1 #!/usr/bin/perl -w
2 # This program searches for the given Perl regular expression in a Zip archive.
3 # Archive is assumed to contain text files.
4 # By Ned Konz, perl@bike-nomad.com
5 # Usage:
6 #       perl zipGrep.pl 'pattern' myZip.zip
7 #
8 use strict;
9 use Archive::Zip qw(:CONSTANTS :ERROR_CODES);
10
11 if ( @ARGV != 2 )
12 {
13         print <<EOF;
14 This program searches for the given Perl regular expression in a Zip archive.
15 Archive is assumed to contain text files.
16 Usage:
17         perl $0 'pattern' myZip.zip
18 EOF
19         exit 1;
20 }
21
22 my $pattern = shift;
23 $pattern = qr{$pattern};    # compile the regular expression
24 my $zipName = shift;
25
26 my $zip = Archive::Zip->new();
27 if ( $zip->read($zipName) != AZ_OK )
28 {
29         die "Read error reading $zipName\n";
30 }
31
32 foreach my $member ( $zip->members() )
33 {
34         my ( $bufferRef, $status, $lastChunk );
35         my $memberName = $member->fileName();
36         my $lineNumber = 1;
37         $lastChunk = '';
38         $member->desiredCompressionMethod(COMPRESSION_STORED);
39         $status = $member->rewindData();
40         die "rewind error $status" if $status != AZ_OK;
41
42         while ( !$member->readIsDone() )
43         {
44                 ( $bufferRef, $status ) = $member->readChunk();
45                 die "readChunk error $status"
46                   if $status != AZ_OK && $status != AZ_STREAM_END;
47
48                 my $buffer = $lastChunk . $$bufferRef;
49                 while ( $buffer =~ m{(.*$pattern.*\n)}mg )
50                 {
51                         print "$memberName:$1";
52                 }
53                 ($lastChunk) = $$bufferRef =~ m{([^\n\r]+)\z};
54         }
55
56         $member->endRead();
57 }