perl のワンライナーに関しての、適当な解説 #1/#2/#3/#4
trim end
はっきり言ってコレを使う人はいないと思うが、シンプルなトリムの例として。
コンセプト
- phred quality 15 以下が五連続したら、カットする。
ワンライナー
$ perl -MO=Deparse -Mvars='@d' -F'' -lane 'push @d, $_ ; next if $. % 4 != 0 ; my $o; L:for my $i ( 0 .. $#F ){ next L if ! defined $F[$i + 4] ; for ( 0 .. 4){ next L if $F[$i + $_] gt q{0} } $o = $i ; last L } ; $o and $d[$_] = substr $d[$_], 0, $o for 1, 3; print join "\n", @d ; @d = () ' fastq.fq
解説
B::Deparse の結果で解説
BEGIN { $/ = "\n"; $\ = "\n"; }
use vars (split(/,/, '@d', 0));
LINE: while (defined($_ = <ARGV>)) {
chomp $_;
our @F = split(//, $_, 0); #3
push @main::d, $_; #1
next if $. % 4 != 0; #2
my $o;
L: foreach my $i (0 .. $#F) {
next L unless defined $F[$i + 4];
foreach $_ (0 .. 4) { #4
next L if $F[$i + $_] gt '0';
}
$o = $i;
last L;
}
$o and $main::d[$_] = substr($main::d[$_], 0, $o) foreach (1, 3); #5
print join("\n", @main::d);
@main::d = (); #6
}
-e syntax OK
while 文を回して、リード毎に @d
にストック(#1)。
処理はリード毎なので、 quality 行以外は次の行に(#2)。
quality をチェックするので @F
へ split(#3)。
quality が五連続で 15 以下になる最初の位置を $o
にセット(#4)。
トリムの実行(#5)。
リード情報のクリア(#6)。
- phred score 15 は、ascii コード 48 番。即ち文字列 '0'
- 文字列の大小比較をしてしまえば良い。態々 phred score に変換するのはナンセンス。
- ラベルは活用した方が良いんじゃね? goto は論外だけど