Varias cosas:
* Si colocas el '-s' en la primera línea del programa, Perl colocará el valor de los argumentos pasados por el usuario en las variables globales del mismo nombre, tal como te indiqué antes
* Después, dentro del programa, no está claro que el usuario pueda buscar por una, más de una, o todas las opciones. O si es obligatorio buscar por todas. Tal como lo tienes indicado en el
if del
@ARGV, todas las opciones son obligatorias. Pero yo creo que no es eso lo que quieres hacer, sino que sean todos opcionales
* En caso de ser opciones, hay que modificar un poco las condiciones, para tenerlas en cuenta solo en el caso de haber sido puestas.
Con esas modificaciones, el programa queda así:
Using perl Syntax Highlighting
#!/usr/bin/perl -s
use strict
;
use warnings
;
##
BEGIN {
eval "use XML::Simple";
if ( $@ ) {
warn "Error al cargar el módulo: XML::Simple\n"
. "Instalar Módulo:\n"
. "\t\tcpan XML::Simple\n\n";
exit();
}
}
our $name;
our $notes;
our $ip;
our $url;
## Ayuda del sistema
if ( !@ARGV ) {
die "Uso: $0 [-name|-notes|-ip|-url] <fichero xml>\n"
. "\t-name=pc Búsqueda por nombre del host\n"
. "\t-notes=test Búsqueda por nota\n"
. "\t-ip=1.1.1.1 Búsqueda por dirección ip\n"
. "\t-url=https://10.0.0.1 Búsqueda por url\n\n"
;
}
my $info = XMLin
($ARGV[0], KeyAttr
=> 1, ForceArray
=> [ 'user' ]);
for my $pc ( @{$info->{technology
}{pc
}} ) {
next if $name and $pc->{name
} !~ /^$name$/;
next if $notes and $pc->{notes
} !~ /^$notes$/;
next if $ip and $pc->{ip
} !~ /^$ip$/;
next if $url and $pc->{url
} !~ /^$url$/;
print "$pc->{name} => $pc->{url} ($pc->{ip})\n";
for my $user ( @{$pc->{user
}} ) {
print "\t$user->{name} : $user->{date}\n";
}
}Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4
Notas:
* Hemos quitado un 'use' que sobraba: el que estaba dentro del BEGIN es suficiente
* El
if del
@ARGV se modifica para que se ejecute en el caso de que no se le hayan pasado argumentos al programa. Como mínimo, hay que pasarle el nombre del fichero xml a procesar
* Dentro del bucle, modificamos los
if para que solo funcionen en caso de haber sido indicadas como argumentos
Ahora ya se puede invocar el programa de varias formas:
- Código: Seleccionar todo
explorer@joaquin:~/Documents/Desarrollo> ./kk.pl kk.xml
marcos => https://10.1.1.1 (10.1.1.1)
admin : 20080101
root : 20080101
marcos2 => https://10.2.2.2 (10.2.2.2)
root : 20080102
explorer@joaquin:~/Documents/Desarrollo> ./kk.pl -name=marcos kk.xml
marcos => https://10.1.1.1 (10.1.1.1)
admin : 20080101
root : 20080101
explorer@joaquin:~/Documents/Desarrollo> ./kk.pl -ip=10.2.2.2 kk.xml
marcos2 => https://10.2.2.2 (10.2.2.2)
root : 20080102
explorer@joaquin:~/Documents/Desarrollo> ./kk.pl -url=https://10.2.2.2 kk.xml
marcos2 => https://10.2.2.2 (10.2.2.2)
root : 20080102
explorer@joaquin:~/Documents/Desarrollo> ./kk.pl -notes=test kk.xml
marcos => https://10.1.1.1 (10.1.1.1)
admin : 20080101
root : 20080101
Se puede hacer la siguiente variación: en el caso de que el fichero xml sea siempre el mismo, entonces lo dejamos indicado en el programa, como teníamos antes:
Using perl Syntax Highlighting
my $info = XMLin
('kk.xml', KeyAttr
=> 1, ForceArray
=> [ 'user' ]);Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4
Entonces tenemos que modificar el primer
if:
Using perl Syntax Highlighting
our $h;
if ( $h ) {
die "Uso: $0 [-h|-name|-notes|-ip|-url] <fichero xml>\n"
. "\t-name=pc Búsqueda por nombre del host\n"
. "\t-notes=test Búsqueda por nota\n"
. "\t-ip=1.1.1.1 Búsqueda por dirección ip\n"
. "\t-url=https://10.0.0.1 Búsqueda por url\n\n"
;
}Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4
Así, si el usuario ejecuta el programa sin más, vuelca todo el fichero. Si indica '-h', sale la ayuda y termina.
Pero si quisiéramos que el usuario ponga al menos una opción de filtrado, deberíamos ponerlo también en el primer
if:
Using perl Syntax Highlighting
if ( !$name and !$notes and !$ip and !$url ) {
die "Uso: $0 [-name|-notes|-ip|-url] <fichero xml>\n"
. "\t-name=pc Búsqueda por nombre del host\n"
. "\t-notes=test Búsqueda por nota\n"
. "\t-ip=1.1.1.1 Búsqueda por dirección ip\n"
. "\t-url=https://10.0.0.1 Búsqueda por url\n\n"
;
}Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4