Estás añadiendo líneas, igual que en el primer programa.
Así, el
hosts va creciendo en cada ejecución. Deberías cambiar '>>' por '>'.
Esta es una posible solución:
Using perl Syntax Highlighting
#!/usr/bin/env perl
#
# Modifica el archivo /etc/hosts,
# agregando una nueva entrada o sobreescribiendo o borrándola.
#
# Joaquín Ferrero. 20120829
#
use File::Slurp;
## Configuración
my $archivohost = '/etc/hosts'; # Archivo a modificar
my $nuestrohost = 'nosotros.universidad.co'; # Nombre del host que vamos a modificar
## Leemos el archivo
my $hosts = read_file($archivohost);
## Preguntamos la nueva IP
print "Introduzca nueva IP para $nuestrohost (nada=borrar entrada): ";
chomp (my $IP = readline);
## Hacemos el cambio
if ($IP) { # Hay IP, hay que agregar o modificar la entrada
if ($hosts !~ s/^.+(\t$nuestrohost)/$IP$1/m) { # Si no conseguimos encontrarla y cambiarla,
$hosts .= "\n$IP\t$nuestrohost\n\n"; # lo agregamos al final
}
}
else { # No hay IP,
$hosts =~ s/\s^.+$nuestrohost\s+//m; # hay que quitar la entrada
}
## Grabamos el resultado
write_file($archivohost, $hosts);
Coloreado en 0.002 segundos, usando
GeSHi 1.0.8.4
Bueno, el funcionamiento es sencillo: leemos el archivo
hosts y preguntamos al usuario por la nueva
$IP que acompañará al nombre de nuestra máquina. Si el usuario ha introducido algún valor (línea 22) entonces intentaremos primero (línea 23) buscar dentro de
$hosts alguna entrada anterior que coincida con ese nombre, y si es el caso, cambiar la
$IP. Si no lo encuentra, es el caso de que
hosts no contenía nuestra máquina, así que, simplemente, la agrega al final (línea 24). En caso de que el usuario no haya introducido ninguna IP, entonces lo que hacemos es buscar la línea donde está nuestra máquina, y quitarla (línea 28). Finalmente, grabamos el nuevo archivo
hosts modificado.
Queda más corto si adoptamos otra estrategia: primero quitamos la entrada, siempre. Y luego la agregamos en caso de que el usuario haya introducido una $IP.
Using perl Syntax Highlighting
$hosts =~ s/\s^.+$nuestrohost\s+//m; # Siempre quitamos la entrada anterior
if ($IP) { # Hay IP,
$hosts .= "\n$IP\t$nuestrohost\n\n"; # lo agregamos al final
}
## Grabamos el resultado
write_file($archivohost, $hosts);
Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4
Un bonito ejemplo de lo que se puede hacer con las expresiones regulares