/ / Perl - Imprimer la première lettre de la colonne - perl

Perl - Imprimez la première lettre de la colonne - perl

J'essaie d'imprimer la première lettre de la colonne 2 d'un fichier d'entrée ainsi que d'autres colonnes intéressantes. Je ne suis pas sûr de savoir pourquoi le script suivant, adapté de Correspondant à la première lettre du mot me donne un avertissement "Utilisation de la valeur non initialisée $ colonnes [2]".

Exemple de fichier d'entrée:

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

Exemple de fichier de sortie:

   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

Scénario

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

METTRE À JOUR L’avertissement s’est produit en raison de la if (/CAY/../HT2/) déclaration pour une raison quelconque - mais comme les fichiers d’entrée sont identiques, je n’ai pas vraiment besoin de cette condition. En outre, comme il n’ya pas de chiffres dans la colonne 2, il est plus approprié d’utiliser la /^(w)/ regex.

Réponses:

1 pour la réponse № 1

Y a-t-il une raison particulière pour laquelle vous devezdivisé en onglets? Obtenir correctement différents types d'espaces dans un fichier texte arbitraire peut être difficile. Si ce n'est pas nécessaire, il semble tout à fait approprié de diviser simplement par un espace, puis prenez la première lettre.

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

Je ne sais pas ce que le reste fait, mais vous pouvez facilement cueillir les colonnes dont vous avez besoin.


1 pour la réponse № 2

Essayez de déboguer ce que vous obtenez après la scission:

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

Comme vous le devinez, votre fichier a des caractères double t. Je veux dire que vous avez probablement: ATOMtt1 CAY GLY X... donc la deuxième colonne est undef


0 pour la réponse № 3

Il me semble que le code qui a donné cet avertissement n’était pas ce que vous montriez, mais plutôt quelque chose comme:

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

Et vous recevez l'avertissement parce que l'expression régulière échoue parce que vous ne trouvez pas un chiffre. Peut-être que tu voulais dire d*?


-3 pour la réponse № 4

En ce qui me concerne, j'aimerais peut-être utiliser la commande de coupe et le pipeline, puis la commande fractionnée pour obtenir les informations exactes souhaitées.