Página 1 de 1

Uso de valor no inicializado (Use of uninitialized value)

NotaPublicado: 2016-10-27 17:15 @760
por abraham03
Hola, buenos días. Tengo un script que lo uso para extraer asignaciones taxonómicas de lo obtenido con qiime. Está desarrollado para extraer cada asignación por separado de los archivos obtenidos en el formato de Silva y el de GreenGenes. Sin embargo, en la línea
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my @kingd=($taxon_value[0]=~m/D_0__(.*);D_1|k__(.*);p__/g);
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

que es donde está las opciones para los dos formatos, tengo un problema que me arroja este mensaje: Use of uninitialized value $_ in pattern match (m//) at Perl2.pl line.....

Hasta el momento he eliminado el problema no agregando el módulo use warnings;. Sin embargo, más que no agregarlo, ¡¡me gustaría saber cuál es el problema !!!

Bueno, creo que esa línea es el problema, porque si la uso de la siguiente manera (para un solo formato, en este caso silva) no me arroja ningún mensaje:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my @kingd=($taxon_value[0]=~m/D_0__(.*);D_1/g);
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Esto es parte del código. El script tiene 6 opciones, una para cada asignación taxonómica. Esta fracción es solo para Filo, pero el resto en la línea del problema es similar.
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. while (<INPUTFILE>){
  2.     $line=$_;
  3.     chomp($line);
  4.     if ($line=~ m/^#/g){
  5.         next;
  6.     }
  7.     elsif ($line=~ m/^[Uu]nassigned/g){
  8.         next;
  9.     }
  10.     elsif ($line){
  11.         my @full_line = $_;
  12.         foreach (@full_line){
  13.             my (@taxon_value)= split (/\t/, $_);
  14.             foreach ($taxon_value[0]){
  15.                 if ($kingdom){
  16.                     my @kingd=($taxon_value[0]=~m/D_0__(.*);D_1|k__(.*);p__/g); # problema !!
  17.                     foreach (@kingd){
  18.                         if ($_=~/^$/){
  19.                             next;
  20.                         }
  21.                         elsif ($_=~ m/^[Uu]nknown/g){
  22.                             next;
  23.                         }
  24.                         elsif ($_=~ m/^[Uu]ncultured$/g){
  25.                             next;
  26.                         }
  27.                         elsif ($_=~ m/^[Uu]nidentified$/g){
  28.                             next;
  29.                         }
  30.                         else {
  31.                             push @taxon_list, $_;
  32.                         }
  33.                     }
  34.                 }
  35.            }
  36.       }
  37.  }
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

Ejemplo de los dos formatos.
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
file_1 (Formato Silva)
D_0__Archaea;D_1__Euryarchaeota;D_2__Thermoplasmata;D_3__Thermoplasmatales;D_4__ASC21;D_5__uncultured euryarchaeote     3.43347639485e-05


file_2(Formato GreenGenes)
k__Bacteria;p__Actinobacteria;c__Actinobacteria;o__Actinomycetales;f__Streptomycetaceae;g__Streptomyces 0.00226480047108
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Muchas gracias.

Re: Uso de valor no inicializado (Use of uninitialized value

NotaPublicado: 2016-10-29 12:07 @546
por explorer
El mensaje de error se refiere a que $taxon_value[0] contiene un valor indefinido, y por lo tanto no puede aplicar la expresión regular.

El porqué está indefinido es por que el split() de la línea 13 ha devuelto justo ese valor, quizás porque $_ estaba a si mismo vacío. Podría ser que $line contuviera un valor indefinido o... quizás un salto de línea que el chomp() de la línea 3 no ha podido quitar. Algo así como cuando te bajas un archivo en formato DOS, y lo procesas en Linux. O al revés. Eso sería compatible con el if() que pregunta por si $line contiene algo o no.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. while ($line = <INPUTFILE>) {
  2.         chomp $line;
  3.  
  4.         next if $line =~ /^#|^unassigned/i;
  5.  
  6.         if ($line) {
  7.                 my @taxon_value = split /\t/, $line;
  8.  
  9.                 if ($taxon_value[0]) {
  10.                         if ($kingdom) {
  11.                                 my @kingd = $taxon_value[0] =~ m/D_0__(.*?);D_1|k__(.*?);p__/g;
  12.  
  13.                                 foreach (@kingd) {
  14.                                         next if /^$/;
  15.                                         next if /^unknown/i;
  16.                                         next if /^uncultured$/i;
  17.                                         next if /^unidentified$/i;
  18.  
  19.                                         push @taxon_list, $_;
  20.                                 }
  21.                         }
  22.                 }
  23.         }
  24. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Re: Uso de valor no inicializado (Use of uninitialized value

NotaPublicado: 2016-10-31 17:16 @761
por abraham03
Hola, muchas gracias, como siempre muy amable.

Hice los cambios que me sugeriste y aun así me sigue apareciendo el mensaje.

Por lo que entiendo de tu respuesta es que si uso: foreach ($taxon_value[0]){}, me generaría el error con aquellas lineas vacías y que no son asignadas, y por ello es más adecuado usar el: if ($taxon_value[0]) {}

El error que me sigue arrogando es el la línea para omitir las lineas vacías, next if /^$/; El mensaje me dice que es ahí, sin embargo la eliminé para ver si el problema lo arrastro desde antes pero es algo muy similar.

¡¡ Muchas gracias !!

Re: Uso de valor no inicializado (Use of uninitialized value

NotaPublicado: 2016-10-31 17:55 @788
por explorer
No, lo que quiero decir es que es posible que el archivo que quieres procesar tengan los finales de línea distintos de los de la plataforma que estás usando para procesarlo. Por ejemplo, que estés trabajando en Linux/UNIX/OSX, pero el archivo tiene los finales de línea al estilo MSDOS de Windows. En ese caso, el chomp() no es lo suficientemente inteligente como para eliminar esos finales de línea.

Una opción sería cambiar la línea del chomp() por una expresión regular que nos garantizara la eliminación de cualquier carácter indeseable, al final de la línea. Prueba a cambiarla por
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.         $line =~ s/\s+$//;              # elimina todos los caracteres espacio del final de la línea
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Pero todo esto es una suposición que yo hago, al ver que $taxon_value[0] está indefinido.

Una forma de saber en qué línea falla, es pintarla antes en pantalla. Inserta esta línea:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.         print "[$line]\n";              # vemos el contenido de $line, delimitado por los corchetes
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Con la ayuda de los delimitadores, verás qué línea es la que provoca el fallo. Y por qué.