• Publicidad

Consulta sobre XML

¿Ya sabes lo que es una referencia? Has progresado, el nível básico es cosa del pasado y ahora estás listo para el siguiente nivel.

Notapor explorer » 2008-06-06 09:22 @432

Las consultas nunca molestan. Siempre aprendemos todos.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Publicidad

Notapor situ » 2008-06-06 11:30 @521

Ya voy entendiendo el script :d, pero me hago un lío con los next if, porque mi idea es buscar por todos los parámetros no solo host, sino usuario, password, date.

Me podrías dar una manito :D Gracias
situ
Perlero nuevo
Perlero nuevo
 
Mensajes: 358
Registrado: 2007-04-09 01:44 @114

Notapor explorer » 2008-06-06 11:52 @536

Bueno, yo he puesto esa solución porque solo comentaste que querías buscar la información de un ordenador.

Tendrás que modificarlo para hacer la búsqueda por otros elementos. Por ejemplo, buscar por usuario consistiría en agregar otro next dentro del bucle for interior.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor situ » 2008-06-06 17:26 @768

Consulta agregar para ver las notas y no me lo toma, me entrega el resultado de todos.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/usr/bin/perl -s
use XML::Simple;
use strict;
use warnings;

our $name;
my $info = XMLin("kk.xml", KeyAttr => 1, ForceArray => [ 'user' ]);
my $host = $name || '.+';
my $notes = $name || '.+';

for my $pc ( @{$info->{technology}{pc}} ) {

    next if $pc->{name} !~ /^$host$/;
    next if $pc->{name} !~ /^$notes$/;

  print "$pc->{name} => $pc->{url} ($pc->{ip})\n";
for my $user ( @{$pc->{user}} ) {
  print "\t$user->{name} : $user->{password}\n";
        }
                        }
 
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

alguien me puede ayudar
situ
Perlero nuevo
Perlero nuevo
 
Mensajes: 358
Registrado: 2007-04-09 01:44 @114

Notapor explorer » 2008-06-06 19:42 @862

Te has equivocado. No es
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
my $notes = $name || '.+';
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


sino
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
my $notes = $notes || '.+';
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Y no es
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
next if $pc->{name} !~ /^$notes$/;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


sino
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
next if $pc->{notes} !~ /^$notes$/;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Falta, además, al principio, un
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
our $notes;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor situ » 2008-06-08 01:47 @116

Consulta, ¿hay alguna forma sencilla de pasar el "-s" a argumento? Así puedo controlar mejor lo que ingresa el usuario.
situ
Perlero nuevo
Perlero nuevo
 
Mensajes: 358
Registrado: 2007-04-09 01:44 @114

Notapor explorer » 2008-06-08 10:35 @483

Sí, lo puedes sacar del código y cuando quieras, lo agregas como primer argumento del programa, desde la línea de comandos, por ejemplo.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor situ » 2008-06-08 20:16 @886

Explorer,
Una consulta estoy tratando de hacer, lo siguiente, si el ARG es igual a "-name" que ejecute la función de esa opción, pero no sé cómo hacer ese if :? no me sale.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/usr/bin/perl
## Comprobacion del MODULO
BEGIN {
    eval "use XML::Simple";
    if ( $@ ) {
        warn  "Error al cargar el modulo: XML::Simple\n"
        . "Instalar Modulo:\n"
        . "\t\tcpan\n"
        . "\t\tcpan> install XML::Simple\n";
exit ();
 }
}

use XML::Simple;
use strict;

## Ayuda del sistema
if ( @ARGV != 1 ) {
    die "\nUse: $0 -opcion\n\n"
      . "   -name=pc                 Busqueda por nombre del host\n"
      . "   -notes=test              Busqueda por nota\n"
      . "   -ip=1.1.1.1              Busqueda por direccion ip\n"
      . "   -url=https://10.0.0.1    Busqueda por url\n\n"
      ;
}



## Variable globales para las busquedas
our $name;
our $notes;
our $ip;
our $url;
## Definicion de variables
my $info = XMLin("kk.xml", KeyAttr => 1, ForceArray => [ 'user' ]);
my $host = $name || '.+';
my $notes = $notes || '.+';
my $ip = $ip || '.+';


for my $pc ( @{$info->{technology}{pc}} ) {
next if $pc->{name} !~ /^$host$/;
next if $pc->{notes} !~ /^$notes$/;
next if $pc->{ip} !~ /^$ip$/;

        print "$pc->{name} => $pc->{url} ($pc->{ip})\n";

for my $user ( @{$pc->{user}} ) {

        print "\t$user->{name} : $user->{password}\n";



}

     }
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4
situ
Perlero nuevo
Perlero nuevo
 
Mensajes: 358
Registrado: 2007-04-09 01:44 @114

Notapor explorer » 2008-06-09 02:17 @137

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í:
Sintáxis: [ Descargar ] [ Ocultar ]
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:
Sintáxis: [ Descargar ] [ Ocultar ]
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:
Sintáxis: [ Descargar ] [ Ocultar ]
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:
Sintáxis: [ Descargar ] [ Ocultar ]
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
Última edición por explorer el 2008-06-09 11:57 @539, editado 1 vez en total
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor situ » 2008-06-09 10:46 @490

Muchísimas gracias
situ
Perlero nuevo
Perlero nuevo
 
Mensajes: 358
Registrado: 2007-04-09 01:44 @114

AnteriorSiguiente

Volver a Intermedio

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 2 invitados