如何在Perl中重写此代码的一个行代码(或命令行中的更少行代码)?
题
我有这样的代码: 通用标签
此代码与我其他问题的答案有关: DNA到RNAPerl获得蛋白质
程序的输出为: 通用标签
我如何用Perl重写该代码,它将在命令行上运行,并且将以更少的代码(如果可能的话,可以使用一行代码)重写它?
PS 1: dna.txt就是这样: 通用标签
PS 2:如果代码行少,则可以将my %proteins
变量写入文件。
解决方案
有人(@kamaci)在另一个线程中给我起了名字。在将蛋白质表保留在命令行中的同时,这是我能想到的最好的方法: 通用标签
(Shell引号,对于Windows引号,请交换'
和"
字符)。此版本标记带有%
的无效密码子,您可以通过在适当位置添加=~y/%//d
来解决此问题。
提示:这将从RNA三元组的原始ASCII编码中提取6位,从而给出0到101058048之间的64个代码;为了得到一个字符串索引,我将结果取模63,但这创建了一个双重映射,遗憾的是必须编码两种不同的蛋白质。遗传标签代码将其中一个映射到另一个编码正确蛋白质的蛋白。
还请注意,两者的s/GGG/GGC/i
运算符前面的括号,将%
运算符与,
的参数列表分开,并确定了substr
与&
的优先级。如果您曾在生产代码中使用过该代码,那么您就是一个坏人。
其他提示
我建议进行的唯一更改是简化您的while
循环:
通用标签
由于y
和tr
是同义词,因此只能使用其中之一。我认为tr
的阅读效果优于y
,因此我选择了tr
。此外,您对它们的称呼非常不同,但这应该具有相同的效果,并且只提及您实际更改的字母。(所有其他字符都已转换为自己。这使得很难查看实际更改的内容。)
您可能希望删除open(INPUT,"<dna.txt");
代码行和相应的close(INPUT);
代码行,因为它们使在shell管道或其他输入文件中使用程序变得更加困难。但这取决于您,如果输入文件总是 成为dna.txt
,并且没有任何不同,没关系。
Ph。我能提出的最好的建议,至少很快。如果确定输入始终已经是大写字母,则还可以删除uc
并保存另外两个字符。或者,如果输入始终相同,则可以立即将其分配给$_
,而不用从任何地方读取它。
我想我不必说此代码不可以用于生产环境或除纯粹乐趣之外的其他任何地方。在进行实际编程时,可读性几乎总是会胜过紧凑性。
我在评论中提到的其他一些版本:
从文件中读取%p和DNA: 通用标签
从带有perl -e
的shell中获取:
通用标签
已经指出了大多数事情,尤其是可读性很重要。我不会尝试减少程序的数量。 通用标签
我添加的唯一“单线”内容是while循环中的push map grep m//g
。请注意,Perl 5.10添加了“ defined or”运算符-//
-可让您编写:
通用标签
好的,open do local $/
文件的slurp习惯用法很容易将小文件保存到内存中。希望您能从中找到启发。:-)
如果将蛋白质数据写入另一个文件,请用空格分隔并且不换行。因此,您可以通过一次读取文件来导入数据。 通用标签
您可以删除代码行“ tr / a,c,g,t / A,C,G,T / ”,因为匹配运算符可以选择大小写不敏感( i 选项)。原始的 foreach 循环可以像上面的代码一样进行优化。 $ 1 变量是匹配操作 /(\ w {3})/ gi 括号内的匹配模式结果