Página 1 de 1

Problemas con paso de array por referencia

NotaPublicado: 2012-02-16 10:49 @492
por irwinvalera
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.

Re: Problemas con paso de array por referencia

NotaPublicado: 2012-02-16 11:04 @502
por explorer
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.

Re: Problemas con paso de array por referencia

NotaPublicado: 2012-02-16 11:15 @510
por irwinvalera
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?

Re: Problemas con paso de array por referencia

NotaPublicado: 2012-02-16 11:26 @518
por explorer
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 ;)

Re: Problemas con paso de array por referencia

NotaPublicado: 2012-02-16 11:50 @535
por irwinvalera
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?

Re: Problemas con paso de array por referencia

NotaPublicado: 2012-02-16 12:09 @548
por irwinvalera
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.

Re: Problemas con paso de array por referencia

NotaPublicado: 2012-02-16 12:12 @550
por explorer
Sí, funciona, pero... ¿sabes por qué?

Si no lo sabes, quizás te vuelva a surgir el mismo problema, en el futuro...

Re: Problemas con paso de array por referencia

NotaPublicado: 2012-02-16 15:52 @703
por irwinvalera
¿Y qué problema podría tener luego? Por favor, necesito saberlo ya que no quisiera que pase nada más adelante.

Re: Problemas con paso de array por referencia

NotaPublicado: 2012-02-16 16:06 @713
por explorer
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.

Re: Problemas con paso de array por referencia

NotaPublicado: 2012-02-16 18:59 @832
por irwinvalera
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.