Compress::Zlib
use Compress::Zlib; my $original = '<Your string here>'; my $compressed = compress($original); my $uncompressed = uncompress($compressed); print "Compress::Zlib ", ( $original eq $uncompressed ? "funziona!" : "NON FUNZIONA?!?!?!" ), "\n"; Per chi conosce bene la zlib, [CompressZlib|Compress::Zlib] espone una serie di wrapper che ne ricalcano molto fedelmente il funzionamento (vedi inflate*(), deflate*()). Tuttavia Perl non sarebbe Perl se non rendesse le cose 'molto' più semplici :-)
#!/usr/bin/perl # # Uso: gzip.pl <nome_file> # # Fa quasi esattamente quello che fa anche gzip # e ovviamente legge gli stessi file! use strict; use warnings; use Compress::Zlib qw(Z_FINISH); use constant BUFFER_SIZE => 64 * 1024; # Nome file come argomento my $file = shift @ARGV; # Se il file termina con .gz, decomprimi if( rindex($file, '.gz') > 0 ) { dezip( $file, substr($file, 0, -3) ); } else { zip( $file, $file.'.gz' ); } Beh, non è proprio così facile, ma quasi. Mancano le due funzioni zip() e dezip(), che fanno parte del programma di esempio: # Decomprime il file sorgente scrivendo nel file destinazione sub dezip { my($srcf, $dstf) = @_; if( open OUT, '>'.$dstf ) { binmode OUT; # Prealloca il buffer di lettura my $buffer = 0x00 x BUFFER_SIZE; if( my $gz = Compress::Zlib::gzopen( $srcf, 'rb' ) ) { print OUT $buffer while $gz->gzread( $buffer, BUFFER_SIZE ); close OUT; $gz->gzclose(); return 1; } } return 0; } # Comprime il file sorgente scrivendo nel file destinazione sub zip { my($srcf, $dstf) = @_; if( open(IN, '<'.$srcf) ) { my $buffer = 0x00 x BUFFER_SIZE; my $gz = Compress::Zlib::gzopen( $dstf, 'wb' ); # wb => write binary while( read(IN, $buffer, BUFFER_SIZE) > 0 ) { $gz->gzwrite( $buffer ); } $gz->gzflush(Z_FINISH); $gz->gzclose(); close(IN); return 1; } return 0; } Ovviamente questo esempio è ridotto all'osso, ma se vi ha stuzzicato, andate pure a consultare la [documentazione http://search.cpan.org/dist/Compress-Zlib] completa.
|