Как переписать однострочный код (или меньше кода в командной строке) этого кода на Perl?

StackOverflow https://stackoverflow.com/questions/5402405

  •  28-10-2019
  •  | 
  •  

Вопрос

У меня есть такой код:

родовое слово

Этот код связан с ответом на другой мой вопрос: ДНК в РНКи получение белков с помощью 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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top