为什么我只从这个 "for" 语句中得到一个元素?
Why am I only getting a single element from this "for" statement?
我正在尝试生成 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:
perl6 version 2015.03-204-g8578022 built on MoarVM version 2015.03-60-g36d56f7
JVM:
perl6 version 2015.03-305-ga95107d built on JVM
java version "1.7.0_79"
OpenJDK Runtime Environment (rhel-2.5.5.1.el7_1-x86_64 u79-b14)
OpenJDK 64-Bit Server VM (build 24.79-b02, mixed mode)
第二个例子就像行尾的经典 perl5 控制语句。
喜欢
say "true" if something();
say "yeah" for ^10;
如果你在 rand_qual()
中放置一个打印语句,你会注意到它仍然被执行了 10 次。
语句修饰符是 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;
另请注意,默认情况下,子句中的最后一条语句提供 return 值。
假设您可能需要长度不是 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 而不是拆分字符串的地方。
我正在尝试生成 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:
perl6 version 2015.03-204-g8578022 built on MoarVM version 2015.03-60-g36d56f7
JVM:
perl6 version 2015.03-305-ga95107d built on JVM java version "1.7.0_79"
OpenJDK Runtime Environment (rhel-2.5.5.1.el7_1-x86_64 u79-b14)
OpenJDK 64-Bit Server VM (build 24.79-b02, mixed mode)
第二个例子就像行尾的经典 perl5 控制语句。
喜欢
say "true" if something();
say "yeah" for ^10;
如果你在 rand_qual()
中放置一个打印语句,你会注意到它仍然被执行了 10 次。
语句修饰符是 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;
另请注意,默认情况下,子句中的最后一条语句提供 return 值。
假设您可能需要长度不是 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 而不是拆分字符串的地方。