[Perl] foreach - array

Gunnar Wolf gwolf en gwolf.org
Jue Nov 17 10:44:32 CST 2005


Sergi - dijo [Thu, Nov 17, 2005 at 04:31:00PM +0100]:
> (...)
> quiero que el script compruebe si son uno o varios los
> host (hasta aquí he llegado) y posteriormente si son
> varios host imprimir el valor de esas etiquetas para
> posteriormente guardarlas en un fichero, aquí es donde
> me quedo bloqueado pues no se como referenciar al
> array que se genera ...
> solo con imprimir las etiquetas host me sobra, el
> pasarlo a un fichero se como hacerlo .
> Agradecería mucho su ayuda.
> Pego lo que he echo hasta ahora:
> 
> ====================================================
> use XML::Simple ;
> 
> if ($#ARGV !=0 ) {
>         print "uso: ./$0 [XML] \n";
>         print "[XML] Fichero de resultados del
> nmap.\n";
>         exit 1;
> }
> # tomo el xml pasado como parametro y lo paso al XMLin
> my $filename = $ARGV[0];
> my $config = XMLin($filename);
> # si hay mas de un host es un array
> if ($config->{objetivos}->{host} =~ /ARRAY/)
> {
>      ¡¡ AQUI ES DONDE QUIERO IMPRIMIR EL TOTAL 
>         DE ETIQUETAS <host> EN UN FOREACH  ¡¡¡
> }
> else
>  {
>   print "un solo host\n";
>  }
> ===========================================================

Ok, antes que nada: ¿Y si el host fuera ARRAY.mynet.org? Tu lógica se
rompería ;-) Mejor verifica el tipo de referencia:

if (ref($config->{objetivos}{host}) eq 'ARRAY') {
    (...)
}

Incluso puedes omitir el "eq 'ARRAY'", pues sólo necesitas verificar
que el elemento sea una referencia (en contraposición de una
cadena)... Como sea, para evitar sorpresas, mejor deja la comparación
explícita. 

Ahora, ¿cómo trabajar con ese arreglo referido? Bueno, primero que
nada, si quieres saber cuántos hosts tienes:

$num_hosts = @{$config->{objetivos}{host}};

Y si quieres iterar sobre cada uno de ellos:

for my $host (@{$config->{objetivos}{host}}) {
    print "$host\n";
}

¿Que qué fumé? Muy fácil: Si $config->{objetivos}{host} es una
referencia a un arreglo. Al ponerlo dentro de @{ }, estás hablando
directo con el arreglo en cuestión. Y, claro, si evalúas un arreglo en
contexto escalar (como $num_hosts = @{$config->{objetivos}{host}};)
Perl te da el número de elementos que hay en el arreglo:

@arr = (1,2,4,8,16);
$elem = @arr;
print "Tengo $elem elementos";

Saludos,

-- 
Gunnar Wolf - gwolf en gwolf.org - (+52-55)1451-2244 / 5623-0154
PGP key 1024D/8BB527AF 2001-10-23
Fingerprint: 0C79 D2D1 2C4E 9CE4 5973  F800 D80E F35A 8BB5 27AF


Más información sobre la lista de distribución Perl