#!/usr/bin/perl
use warnings;
use strict;
die "Error de uso.\n"
."\tcut <fichero origen> <fichero(s) destino>\n"
."\tmake <fichero destino> <fichero(s) origen>\n" unless @ARGV > 2;
# Leemos el programa
my $programa = shift @ARGV;
## Hay que cortar el fichero origen en tantas partes como los de destino
if ( $programa eq 'cut' ) {
my ($origen, @destinos) = @ARGV;
## Abrimos el fichero de origen. Lo hacemos aquí para asegurarnos de que existe
open(my $fh, '<', $origen) or die "ERROR: No pude abrir el fichero de origen: $!\n";
binmode $fh;
## Tamaño de cada bloque. Cuidado con los redondeos: no podemos copiar medio byte!
my $tamano = int( 0.5 + ( (-s $origen) / @destinos) );
## Informar
print "Cortando $origen de ", -s $origen, " en ", scalar @destinos, " ficheros, de tamaño $tamano bytes cada uno...\n";
## Bucle de copia para todos los destinos
for ( my $i=0; $i < @destinos; $i++ ) {
print "\tParte ", $i+1, " -> $destinos[$i]";
## Abrimos el fichero destino correspondiente
open(my $hl, '>', $destinos[$i]) or die "ERROR: No puedo escribir en $destinos[$i]: $!\n";
binmode $hl;
## Nos posicionamos dentro del fichero, leemos el trozo
my $buffer;
seek $fh, $i * $tamano, 0;
read $fh, $buffer, $tamano;
## Escribimos en el destino
print $hl $buffer;
## Cerramos fichero
close $hl;
print "\n";
}
close $fh;
## Hay que abrir los ficheros y meterlos en el destino
} elsif ( $programa eq 'make' ) {
my ($destino, @origenes) = @ARGV;
print "Uniendo los ficheros @origenes en el fichero $destino...\n";
## Abrimos el destino
open(my $hl, '>', $destino) or die "ERROR: No pude escribir en $destino: $!\n";
binmode $hl;
foreach my $origen ( @origenes ) {
print "\tLeyendo $origen";
## Abrimos origen
open(my $fh, '<', $origen) or die "ERROR: No pude abrir el fichero $origen: $!\n";
binmode $fh;
## Leemos el fichero y lo guardamos
my $buffer;
read $fh, $buffer, -s $origen;
print $hl $buffer;
## Cerramos fichero
close $fh;
print "\n";
}
close $hl;
}