for (0..$#ARGV) {
    if ( $ARGV[$_] eq "-o" ) {
        my ( undef, $output_file ) = splice @ARGV, $_, 2;
        open STDOUT, ">$output_file" or die "$!: $output_file";
    }
}

for (@ARGV){
    open F, "<$_" or die "$!: $_";
    binmode F;
    $/ = undef;
    $_ = <F>;
    for ( split // ) {
        my $hex = sprintf "%02x", ord ;
        $_ =~ s/([^\040-\377])/ /;
        push @chars, $_;
        print $hex, " ";
        if ( ++$out_count > 16 ) {
            print " ", splice( @chars ), "\n";
            $out_count = 0;
        }
    }
}

print "   " x ( 17 - $out_count ), " ", @chars, "\n" if $out_count;

close STDOUT;

####


syntax highlighted by Code2HTML, v. 0.9.1