【问题标题】:Why am I only getting a single element from this "for" statement?为什么我只能从这个“for”语句中得到一个元素?
【发布时间】:2015-05-16 12:50:44
【问题描述】:

我正在尝试生成包含 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("", 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-ga95107d java版本“1.7.0_79”
OpenJDK 运行时环境 (rhel-2.5.5.1.el7_1-x86_64 u79-b14)
OpenJDK 64-Bit Server VM(build 24.79-b02,混合模式)

【问题讨论】:

    标签: raku


    【解决方案1】:

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

    【讨论】:

    • 在输入我的答案时,我在规范中找不到它。你知道关于语句修饰符的信息写在哪里吗?我怀疑是S04,但是没找到(loop statements下面有一点,不过那已经是高级话题了,我在找类似“控制条款可以放在语句末尾来修改它”之类的东西。
    • @PatrickJ.S.:是的,它在 S04 中 - 只需在该文档中搜索该术语即可;基本上,它说“在 Perl 5 中工作”,然后列出例外情况
    • 谢谢,我不知道语句修饰符是固定术语。
    【解决方案2】:

    第二个例子就像是行尾的经典 perl5 控制语句。

    喜欢

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-30
      • 1970-01-01
      • 2021-01-25
      • 1970-01-01
      • 1970-01-01
      • 2014-12-04
      相关资源
      最近更新 更多