/ / Perl - Imprimir la primera letra de la columna - perl

Perl - Imprimir la primera letra de la columna - perl

Estoy tratando de imprimir la primera letra de la columna 2 de un archivo de entrada, así como otras columnas de interés. No estoy seguro de por qué el siguiente script, adaptado de Coincidencia de la primera letra de la palabra me da una advertencia de "Uso del valor no inicializado $ columnas [2]".

Ejemplo de archivo de entrada:

ATOM      1  CAY GLY X   1      -0.124   0.401  -0.153  1.00  2.67      PEP
ATOM      2  HY1 GLY X   1      -0.648   0.043  -1.064  1.00  0.00      PEP
ATOM      3  HY2 GLY X   1      -0.208   1.509  -0.145  1.00  0.00      PEP

Ejemplo de archivo de salida:

   1  C  -0.124   0.401  -0.153  1.00  2.67
2  H  -0.648   0.043  -1.064  1.00  0.00
3  H  -0.208   1.509  -0.145  1.00  0.00

Guión

open (my $input_fh, "<", $filename) or die $!;
while (my $data = <$input_fh>) {
chomp $data;
my @columns = split(/t/, $data);
my ($firstletter) = ($columns[2] =~ m/^d+(w)/);
if (/CAY/../HT2/)
print $output_fh join ("t", $columns[1], $firstletter, $columns[6], $columns[7], $columns[8]), "n";
}

ACTUALIZAR La advertencia se produjo debido a la if (/CAY/../HT2/) Por alguna razón, pero como los archivos de entrada son idénticos, realmente no necesito esta condición. Además, dado que no hay dígitos en la columna 2, es más apropiado usar el /^(w)/ expresiones regulares

Respuestas

1 para la respuesta № 1

¿Hay alguna razón particular por la que debasdividir en pestañas? Obtener varios tipos de espacios en blanco en un archivo de texto arbitrario correctamente puede ser delicado. Si no es necesario, parece totalmente apropiado dividir solo por (cualquier) espacio, luego tome la primera letra

my @cols = split "s+", $data;
my ($firstletter) = $cols[1] =~ m/^(w)/;

No estoy seguro de lo que hace el resto, pero puede arrancar fácilmente las columnas que necesita.


1 para la respuesta № 2

Intenta depurar lo que obtienes después de dividir:

my @columns = split(/t/, $data);
local $" = "n"; print "$datanSplitted into:n@columns";

Como supongo que tu archivo tiene doble t caracteres. Quiero decir que probablemente tienes: ATOMtt1 CAY GLY X... así que la segunda columna es undef


0 para la respuesta № 3

Me parece que el código que dio esa advertencia no era lo que mostraba, sino que tenía algo así como

($columns[2]) = ($columns[2] =~ m/^d+(w)/);

Y está recibiendo la advertencia porque la expresión regular está fallando debido a que no encuentra un dígito. Tal vez quisiste decir d*?


-3 para la respuesta № 4

Para mí, tal vez me gustaría usar el comando de corte y la tubería, luego el comando de división para obtener la información exacta que desea.