为什么我只能从此“ for”语句中得到一个元素?

问题描述 投票:4回答:2

我正在尝试生成FASTQ files,其中包含10个具有随机质量得分的随机序列。我最初使用以下代码,效果很好:

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))
}

但是,我想进一步简化,我想也许可以删除右手陈述中的括号。这样做时,我在@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))
}

这是一个错误还是它应该采取的方式?如果没有括号,这是标量上下文吗? Great List Refactor会改变这种行为吗?


我见过这种行为的Perl 6解释器的版本:

MoarVM:

基于MoarVM版本2015.03-60-g36d56f7构建的perl6版本2015.03-204-g8578022

JVM:

基于JVM构建的perl6版本2015.03-305-ga95107dJava版本“ 1.7.0_79”OpenJDK运行时环境(rhel-2.5.5.1.el7_1-x86_64 u79-b14)OpenJDK 64位服务器VM(内部版本24.79-b02,混合模式)

perl6 raku
2个回答
5
投票

Statement修饰符是Perl语法的标志之一(请参阅Perl 5的perldoc),它们在过渡到版本6后仍然存在。

这意味着您的陈述等同于

my @seq;
for ^10 { @seq = rand_fa_seq() }

my @qual;
for ^10 { @qual = rand_qual() }

即,您连续十次分配了一个新值(只有最后一个幸存)。

请注意,这也可以更简洁地写为

my @seq  = rand_fa_seq() xx 10;
my @qual = rand_qual() xx 10;

还请注意,默认情况下,子程序中的最后一条语句提供了返回值。

假设您可能需要长度不为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而不是分割字符串的地方。


2
投票

第二个示例类似于该行末尾的经典perl5控制语句。

say "true" if something();
say "yeah" for ^10;

如果将打印语句放入rand_qual()中,您会注意到它仍在执行10次。

© www.soinside.com 2019 - 2024. All rights reserved.