/ / Perl - Imprime a primeira letra da coluna - perl

Perl - Imprimir primeira letra da coluna - perl

Estou tentando imprimir a primeira letra da coluna2 de um arquivo de entrada, bem como outras colunas de interesse. Não sei por que o script a seguir, adaptado de Correspondência da primeira letra da palavra me dá um aviso "Uso de valor não inicializado $ colunas [2]".

Exemplo de arquivo 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

Exemplo de arquivo de saída:

   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

Roteiro

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";
}

ATUALIZAR O aviso ocorreu devido à if (/CAY/../HT2/) por algum motivo - mas como os arquivos de entrada são idênticos, eu realmente não preciso dessa condição. Além disso, como não há dígitos na coluna2, é mais apropriado usar o comando /^(w)/ regex.

Respostas:

1 para resposta № 1

Existe alguma razão específica que você devedividir em abas? Obter vários tipos de espaço em branco em um arquivo de texto arbitrário corretamente pode ser exigente. Se não for necessário, parece totalmente adequado apenas dividir por (qualquer) espaço e, em seguida, pegue a primeira letra

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

Não sei ao certo o que o resto faz, mas você pode facilmente extrair as colunas de que precisa.


1 para resposta № 2

Tente depurar o que você obtém após a divisão:

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

Como suposição, seu arquivo possui caracteres t duplos. Quero dizer que você provavelmente tem: ATOMtt1 CAY GLY X... então segunda coluna é undef


0 para resposta № 3

Parece-me que o código que deu esse aviso não era o que você mostrava, mas que tinha algo como

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

E você está recebendo o aviso porque a regex está falhando por não encontrar um dígito. Talvez você quis dizer d*?


-3 para resposta № 4

Para mim, talvez eu queira usar o comando cut e pipeline e depois o comando split para obter as informações exatas que você deseja.