gpt4 book ai didi

raku - 为什么我只能从这个 "for"语句中得到一个元素?

转载 作者:行者123 更新时间:2023-12-04 23:45:11 25 4
gpt4 key购买 nike

我正在尝试生成 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



虚拟机:

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)

最佳答案

语句修饰符是 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而不是拆分字符串。

关于raku - 为什么我只能从这个 "for"语句中得到一个元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30275886/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com