Как переписать однострочный код (или меньше кода в командной строке) этого кода на Perl?
Вопрос
У меня есть такой код:
родовое словоЭтот код связан с ответом на другой мой вопрос: ДНК в РНКи получение белков с помощью Perl
Результатом программы является:
родовое словоКак я могу переписать этот код на Perl, он будет работать в командной строке и будет переписан с меньшим количеством кода (если возможно, однострочным кодом)?
PS 1: dna.txt выглядит так:
родовое слово PS 2: Если код будет меньше строки, можно записать переменную my %proteins
в файл.
Решение
Кто-то (@kamaci) назвал мое имя в другой беседе. Это лучшее, что я могу придумать, сохранив таблицу белков в командной строке:
родовое слово (Кавычки оболочки, для Windows, заключающие в кавычки заменяют символы '
и "
символов). Эта версия помечает недопустимые кодоны с помощью %
, вы, вероятно, можете исправить это, добавив =~y/%//d
в подходящее место.
Подсказка: это выбирает 6 бит из необработанного кодирования ASCII тройки РНК, давая 64 кода от 0 до 101058048; чтобы получить строковый индекс, я уменьшаю результат по модулю 63, но это создает одно двойное отображение, которое, к сожалению, должно было кодировать два разных белка. Генеракодический код сопоставляет один из них с другим, кодирующим нужный белок.
Также обратите внимание на круглые скобки перед оператором s/GGG/GGC/i
, которые оба изолируют оператор %
из списка аргументов ,
и фиксируют приоритет substr
по сравнению с &
. Если вы когда-нибудь будете использовать это в производственном коде, вы плохой человек.
Другие советы
Единственные изменения, которые я бы порекомендовал сделать, - это упростить цикл создания кода кода:
родовое слово Поскольку while
и y
являются синонимами, вам следует использовать только один из них.Я думаю, что tr
читается лучше, чем tr
, поэтому я выбрал y
.Кроме того, вы называли их по-разному, но это должен быть тот же эффект и упоминаются только буквы, которые вы действительно меняете.(Все остальные символы были перенесены на самих себя. Из-за этого намного сложнее увидеть, что на самом деле изменяется.)
Возможно, вы захотите удалить tr
и соответствующие строки open(INPUT,"<dna.txt");
, поскольку они значительно усложняют использование вашей программы в конвейерах оболочки или с другими входными файлами.Но решать вам, если входной файл всегда будет иметь код сгенерированного кода и никогда ничего другого, это нормально.
Уф.Лучшее, что я могу придумать, по крайней мере, так быстро.Если вы уверены, что ввод всегда уже в верхнем регистре, вы также можете отказаться от кода uc
, сохранив еще два символа.Или, если входные данные всегда одни и те же, вы можете сразу назначить его для генерации кода кода, а не читать его откуда угодно.
Думаю, мне не нужно говорить, что этот код не следует использовать в производственной среде или где-либо еще, кроме развлечения.При реальном программировании удобочитаемость почти всегда преобладает над компактностью.
Несколько других версий, которые я упомянул в комментариях:
Чтение% p и ДНК из файлов:
родовое словоИз оболочки с общим кодом тега:
родовое словоНа многое уже указывалось, особенно на удобочитаемость.Я бы не стал сокращать программу больше, чем указано ниже.
родовое слово Единственное, что я добавил "однострочно", - это код push map grep m//g
в цикле while.Обратите внимание, что Perl 5.10 добавляет оператор «определенное или» - //
, который позволяет вам писать:
А, ладно, идиома slurp файла open do local $/
удобна для захвата небольших файлов в память.Надеюсь, вы найдете это немного вдохновляющим.:-)
Если данные белков записываются в другой файл, через пробел и без разрыва строки.Итак, вы можете импортировать данные, прочитав файл один раз.
родовое словоВы можете удалить строку кода « tr / a, c, g, t / A, C, G, T / », потому что оператор сопоставления имеет параметр для случаянечувствительный (опция i ).И исходный цикл foreach можно оптимизировать, как показано выше.Переменная $1 здесь - результат сопоставленного шаблона в скобках операции сопоставления /(\w{3})/gi