• Publicidad

Salida con split

Así que programas sin strict y las expresiones regulares son otro modo de hablar. Aquí encontrarás respuestas de nivel avanzado, no recomendable para los débiles de corazón.

Salida con split

Notapor alperez » 2018-04-24 05:29 @270

Hola.

Estoy teniendo una duda sobre una salida aportada desde un comando y no sé muy bien cómo tratarla.

La salida del comando es tal que así:

Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
PORT   GID  GROUP_NAME             Serial# HMD          HMO_BITs
CL1-A    0  1A-G00                  470078 LINUX/IRIX
CL1-A    1  <NOMBRES>               470078 VMWARE_EX
CL1-A    2  <NOMBRES>               470078 VMWARE_EX    54 63
CL1-A    3  <NOMBRES>               470078 VMWARE_EX    54 63
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

Lo que estoy haciendo es guardar esta salida en un array:

@datos_port = `$commands_path\\raidcom get host_grp -port $ports -IH$id_cabina`;

Y luego recorrer este array, de tal forma que cada línea anterior de la salida es una posición de mi array.

Pues el problema lo tengo a la hora de hacer split a cada posición del array y coger los últimos datos.

($puerto,$gid,$group_name,$serial,$hmd,$HMO_BIT) = split(/\s+/,$datos_port);

El problema está que, cuando a la variable $HMO_BIT (donde están 54 63) al separar por espacios en blancos solamente me coge uno de los números y claro, a veces pueden ser muchos más números (54 63 78 14 20 ...) o no tener nada.

Mi pregunta es: ¿Cómo puedo obtener todo lo que venga hasta el final? ¿Tendría que utilizar funciones de strings de posicionamiento?
alperez
Perlero nuevo
Perlero nuevo
 
Mensajes: 32
Registrado: 2013-11-14 17:48 @783

Publicidad

Re: Salida con split

Notapor explorer » 2018-04-24 05:56 @289

Usa una variable array en lugar de escalar:

($puerto,$gid,$group_name,$serial,$hmd,@HMO_BIT) = split " ", $datos_port;

De esa manera tienes todas las columnas restantes en ese array.
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

Re: Salida con split

Notapor alperez » 2018-04-24 06:09 @298

El problema está en que cada línea es una posición del array y viene con todo:

[CL1-A 2 <NOMBRES> 470078 VMWARE_EX 54 63,
CL1-A 3 <NOMBRES> 470078 VMWARE_EX 54 63 ]

Por lo que al hacer el split con los espacios en blanco la última variable me coge hasta el 54, los siguientes números necesitarán de otra variable pero es justo lo que no puedo hacer porque no sé cuántas opciones pueden llegar.

He probado con lo que me has comentado y nada, sigo teniendo el mismo problema.
alperez
Perlero nuevo
Perlero nuevo
 
Mensajes: 32
Registrado: 2013-11-14 17:48 @783

Re: Salida con split

Notapor explorer » 2018-04-24 06:29 @312

Por eso usamos un array: guardará entre 0 y cualquier número de elementos que queden al final de la línea.

Mira: a mí sí que me funciona:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/env perl
  2. #
  3. use v5.20;
  4.  
  5. # descartamos la línea de cabecera
  6. <DATA>;
  7.  
  8. # procesamos el resto de líneas
  9. while (my $datos_port = <DATA>) {
  10.     chomp $datos_port;
  11.  
  12.     my($puerto,$gid,$group_name,$serial,$hmd,@HMO_BIT) = split " ", $datos_port;
  13.  
  14.     say "Puerto:        $puerto";
  15.     say "GID:           $gid";
  16.     say "Group name:    $group_name";
  17.     say "Serial:        $serial";
  18.     say "HMD:           $hmd";
  19.     say "HMO bits:      " . "(" . scalar(@HMO_BIT) . ") @HMO_BIT";
  20.     say "-" x 50;
  21. }
  22.  
  23. __DATA__
  24. PORT   GID  GROUP_NAME             Serial# HMD          HMO_BITs
  25. CL1-A    0  1A-G00                  470078 LINUX/IRIX
  26. CL1-A    1  <NOMBRES>               470078 VMWARE_EX
  27. CL1-A    2  <NOMBRES>               470078 VMWARE_EX    54 63
  28. CL1-A    3  <NOMBRES>               470078 VMWARE_EX    54 63 78 14 20
  29. CL1-A    3  <NOMBRES>               470078 VMWARE_EX    54 63
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4
La salida es:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
Puerto:        CL1-A
GID:           0
Group name:    1A-G00
Serial:        470078
HMD:           LINUX/IRIX
HMO bits:      (0)
--------------------------------------------------
Puerto:        CL1-A
GID:           1
Group name:    <NOMBRES>
Serial:        470078
HMD:           VMWARE_EX
HMO bits:      (0)
--------------------------------------------------
Puerto:        CL1-A
GID:           2
Group name:    <NOMBRES>
Serial:        470078
HMD:           VMWARE_EX
HMO bits:      (2) 54 63
--------------------------------------------------
Puerto:        CL1-A
GID:           3
Group name:    <NOMBRES>
Serial:        470078
HMD:           VMWARE_EX
HMO bits:      (5) 54 63 78 14 20
--------------------------------------------------
Puerto:        CL1-A
GID:           3
Group name:    <NOMBRES>
Serial:        470078
HMD:           VMWARE_EX
HMO bits:      (2) 54 63
--------------------------------------------------
Coloreado en 0.000 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

Re: Salida con split

Notapor alperez » 2018-04-24 07:09 @340

Ok, he visto que el problema está entonces en cómo imprimo por pantalla el array.

printf("| %-3s | %25s | %15s | %10s |\n",$gid, $group_name, $hmd, @HMO_BIT);

Ya que únicamente me imprime una sola posición del array.
alperez
Perlero nuevo
Perlero nuevo
 
Mensajes: 32
Registrado: 2013-11-14 17:48 @783

Re: Salida con split

Notapor explorer » 2018-04-24 14:42 @654

Pues ahora tu problema es otro: ¿estás seguro que @HMO_BIT ocupa igual o menos de 10 espacios? Si necesitas más espacios debes cambiar el %10s.

Y la transformación de @HMO_BIT en cadena de caracteres es muy sencilla: usando comillas dobles o un join().
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

Re: Salida con split

Notapor alperez » 2018-04-25 04:35 @233

Hola.

Sí, con eso se solucionó todo ya. ¡¡Muchas gracias!!
alperez
Perlero nuevo
Perlero nuevo
 
Mensajes: 32
Registrado: 2013-11-14 17:48 @783


Volver a Avanzado

¿Quién está conectado?

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