One thing I like about perl is that even clods like me can manage to get things done. I recently needed a program to put bytes from one file inside of another, and I came up with the following:
#!/usr/bin/perl -w
use strict;
# This program will insert all or part of one
# file inside of another
use List::Util qw(min);
# check the arguments
if (@ARGV < 2 )
{
die "Usage: insert.pl infile outfile [ startin [ startout [ endin
+]]]\n";
}
# open the files
open ( FILOLD, '<', "$ARGV[0]" )
or die "Can't open $ARGV[0] for reading.\n";
open ( FILNEW, '+<', "$ARGV[1]" )
or die "Can't open $ARGV[1] for writing.\n";
# see what we want to copy
my $start = 0;
if (@ARGV >= 3 )
{
seek(FILOLD, $ARGV[2], 0)
or die "Can't seek to position $ARGV[2] in $ARGV[0].\n";
$start = $ARGV[2];
}
if (@ARGV >= 4 )
{
seek(FILNEW, $ARGV[3], 0)
or die "Can't seek to position $ARGV[3] in $ARGV[1].\n";
}
my $end = (stat(FILOLD))[7];
if (@ARGV == 5 )
{
$end = min($ARGV[4], $end);
}
my $bytes = $end - $start;
# do it
while ($bytes > 0)
{
read FILOLD, my ($buffer), min(1024, $bytes);
print FILNEW $buffer;
$bytes -= 1024;
}
# close the files
close FILOLD;
close FILNEW;
This works fine, but I imagine it could be done much more elegantly, so I tought I would solicit ideas for improvement (especially if I missed any gotchas), or even general perl programming considerations. I know I could do a lot more as far as testing for valid parameters goes, but this is only for my own use, so I don't care too much about that.