В заключение, для тренировки в различных частях языка, давайте выполним ту же конкатенацию, используя только оператор печати.
print $DNA1, $DNA2, "\n";
Здесь оператор печати имеет 3 части, разделенные запятыми: 2 ДНК фрагмента в 2 переменных и разделитель строки. Вы можете достигнуть такого же результата со следующим оператором печати
print "$DNA1$DNA2\n";
Возможно нужно перефразировать слоган Perl : «Существует не только 2 способа сделать это!»
До завершения этой части, давайте, обратим внимание на другие применения переменных Perl. Вы уже увидели применение переменных для содержания символьной строки данных цепочки ДНК. Есть также другие типы данных, и для них тоже нужны переменные в языке программитрования. В Perl скалярная переменная, такая как $DNA, может содержать символьную строку, целое число и число с плавающей запятой (с десятичной запятой), логическое значение (true or false) и др. Когда необходимо, Perl вычисляет какие данные в переменной. А сейчас попытайтесь добавить следующие кодовые строки в Пример 4-1 или Пример 4-2 , сохраняя число в скалярную переменную и распечатывая ее.
Большая часть того времени, которое Вы, программист биоинформатики, тратите, уйдет на внесение изменений, аналогичных тем, что в Примере 4-1 и Примере 4-2. Вы получите какие-то данные, это будет ДНК, протеин, записи Генетического Банка или что-то еще, затем Вы будете оперировать этими данными и распечатывать какие-то результаты.
Пример 4-3 ещё одна программа, которая оперирует данными ДНК, она преобразует ДНК в РНК. В клетке преобразование ДНК в РНК результат работы хрупких, сложных, исправляющих ошибки молекулярных механизмов[3]. Здесь же это простая подстановка. Когда ДНК преобразуется в РНК, все T заменяются на U, и это все, что нужно знать нашей программе[4].
[3] Кратко говоря, кодирование ДНК цепочки – это обратное дополнение другой цепочки, которая используется как образец для синтезирования его обратного дополнения, такого как РНК, где Т заменено на U. C двумя обратными дополнениями, это то же, что кодирование замены T на U.
[4] Мы игнорируем механизм вырезания участков РНК вне интронов, это ясно. T обозначает Тимин; U обозначает Урацил.
Example 4-3. Transcribing DNA into RNA
Вот вывод данных Примера 4-3:
Эта короткая программа затрагивает важную часть Perl: способность возможность легко оперировать текстовыми данными, такими как символьная строка с ДНК. Операции могут быть различными: трансляция, реверсия, переупорядочивание и т.п. Эти возможности Perl – это одна из главных причин популярности в биоинформатике и среди программистов в целом.
Сначала программа делает копию ДНК и устанавливает ее в переменную с названием $RNA.
$RNA = $DNA;
Стоит заметить, что когда этот оператор выполнен, эта переменная $RNА содержит ДНК.[5] Помните, Вы вольны называть переменные как Вам угодно, но из-за неточных названий переменных возможны путаницы. В данном случае, после копирования следует информативный комментарий, а за ним оператор, суть которого заставить переменную $RNA содержать РНК, так что все в порядке. Это способ не допустить, чтобы в $RNA содержалось что-либо кроме РНК.
[5] Вернемся к обсуждению из Параграфа 4.2.4.3 о важности порядка частей в операторе присваивания. Здесь значение $DNA, которое является цепочкой данных ДНК, была сохранена в переменной $DNA и присваивается переменной $RNA. Если бы вы написали $DNA=$RNA, значение переменной $RNA (которое не содержит ничего) было бы присвоено переменной $DNA, фактически уничтожая цепочку данных ДНК в этой переменной и оставляя 2 пустые переменные.
($RNA = $DNA) =~ s/T/U/g;
В Примере 3-1 производится с помощью этого оператора:
$RNA =~ s/T/U/g;
В этом выражении два новых элемента: оператор связывания (=~) и команда подстановки s/T/U/g.
Очевидно, достаточно использовать оператор связывания (=~) для переменных, содеражщих символьные строки; здесь переменная $RNA содержит цепочку данных ДНК. Оператор связывания означает «применить операцию справа от символьной строки к переменной слева.
Оператор подстановки, показанный на Рисунке 4-1, требует немного больше объяснений. Разные части команды разделены (или разграничены) косой чертой. s в начале обозначает, что это подстановка. После первой / идет T, который указывает элемент в символьной строке, который должен быть заменен. После второй / идет U – это элемент для замены T. После третьей / стоит g. g означает «global» - это один из возможных модификаторов, которые могут ставиться в этой части оператора. Global означает «сделать это замещение во всей символьной строке», проще говоря, везде, где в этой символьной строке возможно.
Figure 4-1. The substitution operator
Таким образом, значение оператора в целом – «замещение всех T на U в символьной строке, содержащейся в переменной $RNA».
Оператор подстановки это пример использования регулярных выражений. Регулярные выражения это ключ к оперированию текстовыми данными, одно из мощнейших возможностей Perl, Вы сможете увидеть это в следующих главах.
Самый важный ресурс для Perl программиста это Perl-документация. Она скорее всего была установлена на Ваш компьютер, а так её можно найти в интернете на сайте Perl. Perl-документация может немного отличаться в различных компьютерных системах, но web-версия одинакова для всех. Это версия, на которую я буду ссылаться в данной книге. Посмотрите ссылки в Приложении A, чтобы узнать подробности о различных ресурсах с Perl- документацией.
Чтобы попробовать это, давайте найдем в справочнике оператор печати. Для начала, откройте свой веб-браузер и зайдите на http://www.perl.com. Затем кликните на сcылку Документация. Выберите “Perl’s Builin Functions”, затем “Alphabetical Listing of Perl’s Functions”. Вы увидите довольно длинный альфавитный список функций Perl. Возможно, как-нибудь Вы снова захотите найти эту страницу, поэтому можно сделать закладку на неё в веб-браузере, может оказаться, что вы часто обращаетесь к ней. Теперь кликните на Print, чтобы прочитать об операторе печати.
Попробуйте показанные примеры, чтобы почувствовать, как на самом деле используются языковые возможности. Это обычно самый быстрый способ извлечь необходимые знания.
Как-нибудь при просмотре документации Вы обнаружите, что чтение документации помогает ответить на некоторые вопросы, но так же вызывает другие. Документация направлена подать всю информацию в сжатом виде, что может испугать новичков. Например, документация по функции Print начинается так «Печатает символьную строку или список символьных строк, разделенных запятыми. Выдает TRUE в случае успеха». Но затем идет куча мусора (или так может показаться на данном этапе обучения): индекс файла, выходной поток, списковый контекст...
Вся эта информация необходима в документации, ведь в действительности Вам когда-то понадобится вся информация. Пока Вы можете не обращать внимание на то, что не требуется.
Perl документация также включает в себя несколько обучающих программ, которые могут сильно помочь в изучении Perl. Они иногда требуют больших знаний языка, чем те, которыми обладают новички, но скорее всего они окажутся Вам очень полезными. Изучение документации - это отличный способ ускорить изучение языка Perl.
Как вы помните из Главы 1, полимер ДНК составлен из нуклеотидов. Установив тесную взаимосвязь между 2 цепочками ДНК в двойной спирали, оказалось, что довольно просто написать программу, которая зная одну цепочку распечатывает другую. Данный расчет - важная часть многих биоинформатичеких программ. Например, при поиске ДНК в базе данных обычно автоматически идет и поиск обратного дополнения ДНК, в результате может быть найдена цепочка обратного порядка некоего известного гена.
Не затягивая более, рассмотрим Пример 4-4, в котором используется несколько известных свойств Perl. Как Вы можете видеть, сначала пробуется один метод, который оказывается неудачным, затем другой успешный.
Example 4-4. Calculating the reverse complement of a strand of DNA
Вот как должен выглядеть результат Примера 4-4 на вашем экране:
Вы можете проверить, действительно ли 2 цепочки ДНК это обратные наборы друг друга, прочитав один слева направо и другой справа налево, т.е. начав читать с разных концов. Затем сравните каждую пару основ, когда читаете 2 цепочки: они должны всегда быть в паре С с G и A с Т.
Прочитав только несколько символов начиная с начальной ДНК и обратного набора ДНК из первой попытки вы увидете, что первая попытка рассчета обратного дополнения не удалась. Это был неверный алгоритм.
С таким Вы иногда будете встречаться во время программирования. Вы напишите программу, завершите работу, а затем обнаружите, что она не работает так, как вы ожидали. В первом случае мы использовали возможности языка, с которыми уже были знакомы, и попытались их применить для новой задачи. Но это не сработало. Что было не так?
Вы обнаружите, что случай, когда вы пишете код, а он не работает, становится привычным! Поэтому, Вы или отлаживаете синтаксис (что обычно легко может быть сделано по сообщениям об ошибках), или тщательнее обдумываете программу, находите причину того, почему она не работает, а затем пытаетесь разработать новый и более успешный вариант. Часто для этого требуется просмотр документации языка программирования, поиск детальной информации о том, как устроен язык программирования, в надежде найти возможность устранить проблему. Если это может быть решено на компьютере, значит возможно решить и с помощью Perl. Вопрос в том, как именно?
В примере 4-4 первая попытка вычислить обратный набор не удалась. Каждая основа в символьной строке была транслирована как целая, используя 4 замены в глобальном виде. Нужен другой способ. Вы можете продвигаться по ДНК слева направо, смотреть на каждую основу друг за другом, делать изменения в дополнительном коде и затем смотреть на следующую основу в ДНК, передвигаясь к концу символьной строки. Затем просто развернуть символьную строку. Это на самом деле действенный метод и его совсем не сложно выполнить в Perl, хотя потребуются некоторые знания языка программирования, которые до Главы 5 не встречались.