2016-02-25 4 views
-1

Я пытаюсь напечатать первую букву столбца2 входного файла, а также другие столбцы, представляющие интерес. Я не уверен, почему следующий сценарий, адаптированный из Matching first letter of word, дает мне «предупреждение о неинициализированном значении $ columns [2]».Perl - Распечатать первую букву столбца

ввода Пример файла:

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 

Script

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/) заявления по какой-то причине - но поскольку входные файлы являются идентификаторами Мне не нужно это условие. Кроме того, поскольку в столбце 2 нет цифр, более целесообразно использовать регулярное выражение /^(\w)/.

+2

_'Использование неинициализированного значения $ columns [2] '_ является предупреждением, а не ошибкой. – serenesat

+0

mybe у вас есть пустая строка в вашем файле? – Jens

+1

Почему фигурные скобки в заявлении на печать? – serenesat

ответ

1

Есть ли какая-то особая причина, по которой вы должны разделить на вкладках? Получение различных видов пробелов в произвольном текстовом файле может быть разборчивым. Если нет необходимости, кажется, полностью уместно только расщепляется (любой) пространства, а затем захватить первую букву

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

Я не уверен, что сделает все остальное, но вы можете легко срывать столбцы вам нужно.

+0

Я думаю, потому что этот '1 CAY GLY X 1' - это второй столбец, который внутренне разбивает данные по пробелам. Поэтому он, возможно, потребовал просто «\ t +» –

+0

@EugenKonkov. Правильно, я понял, что вся фраза считается одной колонкой. Однако это не поддерживается на выходе, '1 C' (не остальное). Кроме того, ему явно нужно попасть внутрь, и если в какой-то момент его нужно вернуть, то это легко в игровых автоматах. (Я бы даже сказал лучше, поскольку отдельные слова можно манипулировать отдельно.) Но именно поэтому я начал с того, что спросил - я не знаю, нужно ли это делать по вкладкам. Кажется, это не так. – zdim

0

Это звучит для меня как код, который дал, что предупреждение было не то, что вы показываете, но вместо того, чтобы было что-то вроде

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

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

+0

Да, код примера мне кажется слишком разбитым –

1

Попытка отладить то, что вы получите после расщепления:

my @columns = split(/\t/, $data); 
local $" = "\n"; print "$data\nSplitted into:\[email protected]"; 

Как угадать ваш файл имеет двойные символы \ т. Я имею в виду, что вы, вероятно, имеете: ATOM\t\t1 CAY GLY X..., так что вторая колонка undef

-3

Для меня, возможно, мне бы хотелось использовать команду cut и конвейер, а затем команду split, чтобы получить нужную вам информацию.

Смежные вопросы