Я намагаюся надрукувати першу літеру колонки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
Для мене, може бути, я хотів би використовувати команду скорочення і трубопроводу, потім розділити команду, щоб отримати точну інформацію ви хочете.