perl6 – 为什么我只从这个“for”语句中获得单个元素?
我试图生成包含10个具有随机质量分数的随机序列的
FASTQ files.我最初使用以下代码,工作正常:
my @seq = (rand_fa_seq() for ^10); my @qual = (rand_qual() for ^10); @seq.perl.say; @qual.perl.say; sub rand_fa_seq { return join("",roll(20,"ACGT".comb)); } sub rand_qual { return join("","EFGHIJ".comb)) } 但是,想要进一步简化它,我想也许我可以从右手语句中删除括号.当我这样做时,我只在@seq和@qual中获得了一个元素. my @seq = rand_fa_seq() for ^10; my @qual = rand_qual() for ^10; @seq.perl.say; @qual.perl.say; sub rand_fa_seq { return join("","EFGHIJ".comb)) } 这是一个错误还是它应该表现的方式?如果没有括号,这是一个标量上下文吗? Great List Refactor会改变这种行为吗? 我见过这种行为的Perl 6解释器的版本: MoarVM:
JVM:
解决方法
语句修饰符是Perl语法的标志之一(参见Perl 5的
perldoc),它们在过渡到版本6后幸存下来.
这意味着您的陈述等同于 my @seq; for ^10 { @seq = rand_fa_seq() } my @qual; for ^10 { @qual = rand_qual() } 即你连续10次分配一个新值(只有最后一个幸存). 请注意,这也可以写得更加简洁 my @seq = rand_fa_seq() xx 10; my @qual = rand_qual() xx 10; 另请注意,默认情况下,sub中的最后一个语句提供返回值. 假设您可能需要长度不是20的序列,您可以参数化该值,最后得到以下结果: sub rand-fa-seq($n = 20) { <A C G T>.roll($n).join } sub rand-qual($n = 20) { <E F G H I J>.roll($n).join } my @seq = rand-fa-seq() xx 10; my @qual = rand-qual() xx 10; 我用过quote words而不是拆分字符串. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |