4

ランダムな品質スコアを持つ 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))
}

しかし、もっと簡単にしたいので、右辺の括弧を外せばいいのではないかと考えました。私がそうしたとき、私は と に単一の要素しか得ませんでし@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 バージョン 2015.03-204-g8578022 MoarVM バージョン 2015.03-60-g36d56f7 上に構築

JVM:

perl6 バージョン 2015.03-305-ga95107d JVM Java バージョン "1.7.0_79" 上に構築
OpenJDK ランタイム環境 (rhel-2.5.5.1.el7_1-x86_64 u79-b14
)

4

2 に答える 2

5

ステートメント修飾子は Perl 構文の特徴の 1 つであり (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;

デフォルトでは、サブルーチンの最後のステートメントが戻り値を提供することにも注意してください。

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;

ここで、文字列を分割する代わりに引用語を使用しました。

于 2015-05-16T15:41:56.627 に答える