• Publicidad

Problemas con paso de array por referencia

¿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.

Problemas con paso de array por referencia

Notapor irwinvalera » 2012-02-16 10:49 @492

Buen día, nuevamente por aquí esperando aprender de sus sabios conocimientos :D

Mi problema ahora radica en un array que es enviado a una función, pero que al ser recibido no muestra todos sus valores para ser evaluados en una condicional, sin embargo cuando los imprimo uno por uno sí los muestra, pero en su conjunto tampoco. Les dejo los extractos de código.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. $cod_resultado = &eval_rpta($rpta, $ok, $war, \@cadena_critical);
  2.  
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #recibo todos los datos enviados y el último es el array que contiene 4 datos.
  2. my $dscRptaScript = shift;
  3. my $dscOK = shift;
  4. my $dscWARNING = shift;
  5. my ($uno)=@_;
  6.  
  7. #esto si muestra inclusive si le cambio los valores de 0 a 3 porque son 4 elementos enviados.
  8. print @$uno[0];
  9.  
  10. #esto no muestra exepto uno de ellos
  11. print @$uno[0] . @$uno[1] . @$uno[2] . @$uno[3];
  12. print join '-', @$uno;
  13.  
  14. #aqui tampoco evalua, exepto solo un valor de los tantos...
  15. if ($dscRptaScript =~ m/$dscOK/){
  16.     return 'O';
  17. }elsif ($dscRptaScript =~ m/$dscWARNING/){
  18.     return 'W';
  19. }elsif ($dscRptaScript =~ m/@$uno[0]/){
  20.     return 'C';
  21. }
  22. return '?';
  23.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


No sé en qué me equivoqué, quisiera su ayuda, por favor.
irwinvalera
Perlero nuevo
Perlero nuevo
 
Mensajes: 11
Registrado: 2012-02-03 15:52 @702

Publicidad

Re: Problemas con paso de array por referencia

Notapor explorer » 2012-02-16 11:04 @502

La notación @$uno[0] es muy confusa. Y si solo estamos recuperando un valor, incluso está mal, ya que el sigilo '@' está indicando que queremos recuperar una lista de valores.

Es mejor indicar, visualmente, que $uno contiene una referencia al array que pasamos como argumento (es decir, estamos pasando como argumento una referencia a un array).

Así, es mejor ponerlo como $uno->[0]

Otra cosa es si queremos recuperar una lista de valores: @{$uno}[2,3]

Más información, en perlref.
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: Problemas con paso de array por referencia

Notapor irwinvalera » 2012-02-16 11:15 @510

Gracias por la pronta respuesta, he probado lo que me dices pero aún sigo con el mismo problema... He buscado muchas alternativas pero ninguna funciona, pero lo que me he dado cuenta es lo siguiente, por ejemplo mis valores son:

Can
CRITICAL
refused
errors

y cuando mando a imprimir a todos los valores me devuelve lo siguiente por ejemplo

errorsdL

es decir que muestra todos pero los demás es como si estuvieras detrás :S La verdad, no entiendo por qué pasa ello. ¿Alguna solución?
irwinvalera
Perlero nuevo
Perlero nuevo
 
Mensajes: 11
Registrado: 2012-02-03 15:52 @702

Re: Problemas con paso de array por referencia

Notapor explorer » 2012-02-16 11:26 @518

Es un fallo de los caracteres de fin de línea, que tienen esas cadenas de caracteres. Si salen unos encima de otros, es que contienen caracteres de retorno de carro, pero no de avance de línea.

P.D. Estamos en el foro Intermedio. Las respuestas son acordes al foro en que se encuentran ;)
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: Problemas con paso de array por referencia

Notapor irwinvalera » 2012-02-16 11:50 @535

Entiendo. Al parecer mi problema entonces viene ¡unas líneas atrás! Ese array que envío viene del siguiente código:

@cadena_critical = split(/\n/,$crit);
my $cod_resultado = &eval_rpta($rpta, $ok, $war, \@cadena_critical);

$crit es una cadena de texto que viene de la base de datos, separado por saltos de línea, entonces cuando lo recupero necesito que se corten en pedazos y lo único que se me ocurrió fue usar split() y con "\n" indicarle que corte cada salto de línea y se almacene en el array. ¿Qué debo hacer entonces para que no me siga dando este problema?
irwinvalera
Perlero nuevo
Perlero nuevo
 
Mensajes: 11
Registrado: 2012-02-03 15:52 @702

Re: Problemas con paso de array por referencia

Notapor irwinvalera » 2012-02-16 12:09 @548

Ya solucioné mi problema en vez de usar "\n" le puse un espacio en blanco como separador y eso solucionó todo :D Gracias por las respuestas, de todas formas.
irwinvalera
Perlero nuevo
Perlero nuevo
 
Mensajes: 11
Registrado: 2012-02-03 15:52 @702

Re: Problemas con paso de array por referencia

Notapor explorer » 2012-02-16 12:12 @550

Sí, funciona, pero... ¿sabes por qué?

Si no lo sabes, quizás te vuelva a surgir el mismo problema, en el futuro...
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: Problemas con paso de array por referencia

Notapor irwinvalera » 2012-02-16 15:52 @703

¿Y qué problema podría tener luego? Por favor, necesito saberlo ya que no quisiera que pase nada más adelante.
irwinvalera
Perlero nuevo
Perlero nuevo
 
Mensajes: 11
Registrado: 2012-02-03 15:52 @702

Re: Problemas con paso de array por referencia

Notapor explorer » 2012-02-16 16:06 @713

Cuando a split() se le pasa como primer argumento un espacio en blanco, actúa de forma especial: hace el corte de las columnas por cualquier agrupación de caracteres tradicionalmente considerados "espacios en blanco", que son: el propio espacio en blanco, el tabulador, y los caracteres de fin de línea.

Por eso te funciona: por que está cortando por los caracteres de fin de línea, aunque no sepas cuáles son.

El problema que podría ocurrir en el futuro es si en alguno de los campos aparece un espacio en blanco que no debería forma parte de los delimitadores. El split() no se dará cuenta, y creará una columna de más.

Si sabes que eso nunca va a ocurrir, pues no pasa nada.

Si lo quieres hacer de forma más estricta, pues entonces hay que adoptar una solución como la comentada hace unos días, al final de este hilo, en la que al split le damos la expresión regular /[\012\015]+/, y así nos aseguramos que estamos cortando por los finales de línea, independientemente de si el archivo fue creado en Windows, MSDOS, UNIX/Linux o MacOS.
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: Problemas con paso de array por referencia

Notapor irwinvalera » 2012-02-16 18:59 @832

Excelente como siempre, explorer. En realidad el código nunca tendrá espacios por cada línea =) por ese lado todo bien :D pero de verdad ¡gracias por la explicación! Y lo último más aún porque en algún momento lo llegaré a usar.
irwinvalera
Perlero nuevo
Perlero nuevo
 
Mensajes: 11
Registrado: 2012-02-03 15:52 @702


Volver a Intermedio

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado