#!/usr/bin/perl -w use strict; use IO::Scalar; use Convert::UU qw(uuencode uudecode); use Archive::Tar; sub slurp { local $/; my $fh = shift; open FH, $fh; $fh = ; close FH; return $fh; } my $textfile = "text"; my $binfile = "binary"; my $generated_code = "archive.pl"; my $tarball_name = "tb.tar"; my $uud_tarball_name = "new.tb.tar"; my $tarball = Archive::Tar -> new($tarball_name); $tarball -> add_files ($textfile, $binfile); $tarball -> write ($tarball_name); my $uu_data = slurp ($tarball_name); my $uue_data = uuencode ($uu_data); ##### ## here we are dealing with the generated file. # open CODE, ">$generated_code" or die "$!"; print CODE << 'CODE_LABEL'; #!/usr/bin/perl -w # automatically created perl code including UUencoded tarball. use strict; use IO::Scalar; use Convert::UU qw(uuencode uudecode); use Archive::Tar; my $encoded_tarball = << 'TARBALL_LABEL'; CODE_LABEL close CODE or die "not proceeding because we couldnt close CODE\n$!"; ##### ## here we have finished writing the initial code segments to # the generated file. { # because we are localizing $/ we dont want this to escape local $/; open CODE, ">>$generated_code" or die "unable to append to $generated_code : $!"; print CODE $uue_data; close CODE or die "error closing CODE\n$!"; } # we're done being foolish ##### ## we are now re-opening our generated code to append more code # to it so it can de-uu and de-tar its file. open CODE, ">>$generated_code" or die "unable to re-open CODE : $!"; print CODE << 'CODE_LABEL'; TARBALL_LABEL # begin decoding sequence... my $decoded_tarball = uudecode ($encoded_tarball); tie *BALL, 'IO::Scalar', \$decoded_tarball; my $uud_tarball_name = "tarball.decode.tar"; my $new_tarball = Archive::Tar -> new($uud_tarball_name); $new_tarball -> extract(\*BALL) or warn "error extract()ing : " . $new_tarball -> error(); CODE_LABEL __END__