/ / Perl - Друкувати першу букву стовпця - perl

Перл - надрукувати першу літеру стовпця - perl

Я намагаюся надрукувати першу літеру колонки2 вхідного файлу, а також інші цікавлять стовпці. Відповідність першої літери слова дає мені попередження "Використання неініціалізованих значень $ стовпців [2]".

Приклад вхідного файлу:

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

Приклад вихідного файлу:

   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

Сценарій

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

UPDATE Попередження сталося через if (/CAY/../HT2/) з якихось причин - але так як вхідні файли ідентичні, я дійсно не потребую цієї умови. /^(w)/ регулярний вираз

Відповіді:

1 для відповіді № 1

Чи існує певна причина, чому ви повинні це зробитирозділити на вкладки? Отримання різних видів пробілів у довільному текстовому файлі правильно може бути прискіпливим. Якщо це не обов'язково, здається цілком придатним просто розбитись (будь-яким) простором, а потім схопити першу букву

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

Я не впевнений, що інші роблять, але ви можете легко зірвати потрібні вам стовпці.


1 для відповіді № 2

Спробуйте відлагодити, що ви отримаєте після поділу:

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

Уявіть, що у вашому файлі є подвійні символи. Маю на увазі, можливо, ви маєте: ATOMtt1 CAY GLY X... другий стовпчик undef


0 для відповіді № 3

Мені здається, що код, який дав це попередження, не був тим, що ви показуєте, а мали щось подібне

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

І ви отримуєте попередження, оскільки регулярний вираз не вдається через незначення цифри. Можливо, ви мали на увазі d*?


-3 для відповіді № 4

Для мене, може бути, я хотів би використовувати команду скорочення і трубопроводу, потім розділити команду, щоб отримати точну інформацію ви хочете.