我正在尝试生成包含10个具有随机质量分数的随机序列的FASTQ文件.我最初使用以下代码,工作正常:
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("", roll(20,"EFGHIJ".comb))
}
Run Code Online (Sandbox Code Playgroud)
但是,想要进一步简化它,我想也许我可以从右手语句中删除括号.当我这样做,我只有在一个单一的元素@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("", roll(20,"ACGT".comb));
}
sub rand_qual
{
return join("", roll(20,"EFGHIJ".comb))
}
Run Code Online (Sandbox Code Playgroud)
这是一个错误还是它应该表现的方式?如果没有括号,这是一个标量上下文吗?将在大名单重构改变这种行为?
我见过这种行为的Perl 6解释器的版本:
MoarVM:
基于MoarVM版本2015.03-60-g36d56f7构建的perl6版本2015.03-204-g8578022
JVM:
perl6版本2015.03-305-ga95107d建立在JVM java版本"1.7.0_79"
OpenJDK运行时环境(rhel-2.5.5.1.el7_1-x86_64 u79-b14)
OpenJDK 64位服务器VM(版本24.79-b02,混合模式)
语句修饰符是Perl语法的标志之一(参见Perl 5的perldoc),它们在过渡到版本6后幸存下来.
这意味着您的陈述等同于
my @seq;
for ^10 { @seq = rand_fa_seq() }
my @qual;
for ^10 { @qual = rand_qual() }
Run Code Online (Sandbox Code Playgroud)
即你连续10次分配一个新值(只有最后一个幸存).
请注意,这也可以写得更加简洁
my @seq = rand_fa_seq() xx 10;
my @qual = rand_qual() xx 10;
Run Code Online (Sandbox Code Playgroud)
另请注意,默认情况下,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;
Run Code Online (Sandbox Code Playgroud)
我在哪里使用引用词而不是分裂字符串.