/ / Perl - Stampa la prima lettera della colonna - perl

Perl - Stampa prima lettera di colonna - perl

Sto cercando di stampare la prima lettera della colonna 2 di un file di input e altre colonne di interesse. Non sono sicuro del motivo per cui il seguente script, adattato da La prima lettera di parola corrispondente mi dà un avviso "Uso di valore non inizializzato $ colonne [2]".

Esempio di file di input:

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

Esempio di file di output:

   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

copione

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

AGGIORNARE L'avviso si è verificato a causa di if (/CAY/../HT2/) per qualche motivo - ma poiché i file di input sono identici, non ho davvero bisogno di questa condizione. Inoltre, poiché non ci sono cifre nella colonna2, è più appropriato usare il /^(w)/ regex.

risposte:

1 per risposta № 1

C'è qualche motivo particolare che devi farediviso in schede? Ottenere correttamente vari tipi di spazio bianco in un file di testo arbitrario può essere esigente. Se non necessario, sembra perfettamente giusto dividere per (qualsiasi) spazio, quindi prendere la prima lettera

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

Non sono sicuro di cosa faccia il resto, ma puoi facilmente strappare le colonne di cui hai bisogno.


1 per risposta № 2

Prova a eseguire il debug di ciò che ottieni dopo la divisione:

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

Come indovino il tuo file ha doppi caratteri t. Voglio dire che probabilmente hai: ATOMtt1 CAY GLY X... così è la seconda colonna undef


0 per risposta № 3

Mi sembra che il codice che ha dato quell'avvertimento non era quello che mostri ma invece aveva qualcosa di simile

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

E stai ricevendo l'avviso perché la regex non riesce a causa della mancata ricerca di una cifra. Forse intendevi d*?


-3 per risposta № 4

Per me, forse vorrei usare il comando cut e la pipeline, quindi dividere il comando per ottenere le informazioni esatte che desideri.