1

次のファイルは、ペアエンドの fastq ファイルの 2 つのメイトです。各 fastq を長さに基づいて分けたいと思います。

mate1.fq:

@SRR127.1
TGGTTATGATGTTTGTGTAGGAATAGAAATTTTGATTAAGATATTAGTGAAATTTGAATGTAGTTTATTTGGAAGTTATGGAGAGTTTATATTGTATTTATGTTTATTGTTGTAGATTTATATTTATGTGTATATATTAGTTTTTTTGTGT
+
ABAAAF4FFFFFGGGGGGFFGGFGHGFGHHHHHGGCFFGHHHHH5FDBED55DGGFEGFHHHGBHDDHHHFF3AB3FFG5CBGBEF5BD5DGFEGHFAGAFEDGHGFHHGHGEFFGFGGHFEGHHFHGBEBGHHHHGHBHHFHHGGFGHH2
@SRR127.2
TATGGTAAGAAAATTGAAAATTATAAAAAATGAAAAATGTTTATTTGATGATTTGAAAAATGATGAAATTATTGAAAAATGTGAAAAATGAGAAATGTATATTGTAGGATTTGGAATATGGTGAGATAAATGAAAATTATAGTAAATG
+
AABAA5@D4@5CFFCA55FFGGHDGFHFFCC45DGFA2FA5DD55AAAA55DDBDEDDBGGFF5BA5DDABF5D5B5FF1ADFB5EDGHFG5@BFBD55D5FFB@@5@GBGEFBGHHGB@DBBFHFBDG3B43FFH@FGFHH?FHHHH

mate2.fq:

@SRR127.1
ACCTATAAAAAAACCATATCAATAACTATAAAATCTTTATAAAATCCCACCCAATTAAAAAAAAATAAATTAATACATATAAAACCTTAAACACATAAAACATAATCACATACTATATAAACAATTACTATCACTACTAAACACCTAATA
+
>AA?AF13B@D@1EFCGGGFFG3EBGHHHBB2FGHHGHGFDGHHDFEGFHGGGHG1FFF1GGCGGGBGHHHHHFHHHHFHEGGFHF0BD1FGHHAGEGHFHHHFGGFHHGHHHFHHGGFHBGHFED1FBGFGFHDGHGHFGG1GB0GFHH
@SRR127.2
CTATTTCTCATTTTTTTATAATTTTCAATTCTCTTACCATATTCCACATCCTACACTAAACATTTCTAAATTTTCCACCTTTTTCTATTTTTCTCACCATATTTCATATCCTAAAAAACATATTCCTCATTTACTATAATTTTCAATTATC
+
11>>AFFDFF3@FFF?EFFGFBGHFDFA33D2FF2GGHFE12DD221AF1F1E1BG1GGBFBGGEGHDAABGAGDFABGG1BBDF12A2@2BG@2@DEFFF2B2@2222BB2211FGEE/11@22B2>1B22F2>GBGBD22BGD2>2B22

これを行うために次のコードを書きましたが、2 番目のファイル ( mate2.fq) でのみ奇妙なエラーが発生しますが、どちらも 151 bp の読み取りがあります。

#!/usr/bin/perl

use strict;
use warnings;

my @fh;

my $file_name = $ARGV[0];
my $infile    = $ARGV[1];

#convert every 4-line fastq to 1-line
open(FH, "cat '$infile' | awk '{printf \"%s%s\",\$0,(NR%4?FS:RS)}' | ");

while (<FH>) {
  chomp;

  my @line = split(/\s+/, $_);
  my $len  = length($line[1]);

  if ($len >= 100) {

    #print $len,"\n",$_,"\n";
    push @fh, $len;

    if (not defined $fh[$len]) {
      open $fh[$len], '>', "$file_name\_$len";
    }
    print { $fh[$len] } (join("\n", @line), "\n");
  }

}

エラー:

Can't use string ("151") as a symbol ref while "strict refs" in use at

これらのファイルを処理するにはどうすればよいですか?

4

2 に答える 2

5

このエラーが具体的に意味することは、参照を期待する何かを行っているが、参照を取得していないことです。

この線:

print {$fh[$len]} (join("\n",@line),"\n");

と呼ばれるファイルハンドルのリストのように見えるものから、明示的にファイルハンドルに出力します@fh

この行:

push @fh, $len;

そのリストに数値を挿入します。(おそらく$line[1]151 文字の長さです)。そして、あなたは実際にしようとしています:

 print {151} (join("\n",@line),"\n");

うまくいけば、それはかなり明白です-うまくいきません。ファイルハンドルを開こうとしているように見え、それを配列に挿入します。

open $fh[$len], '>', "$file_name\_$len";

代わりに、これにハッシュを使用する方がはるかに良いと提案できますか? それ以外の場合は、空の要素でいっぱいの配列があり、1 つが入力されています。

代わりにできる場所:

#further up:
my %fh; 


#and then
open ( $fh{$len}, ">", "$file_name\_$len" ) or warn $!; 

ただし、最後にファイルハンドルを閉じることを忘れないでください:

foreach my $key ( keys %fh ) {
   close ( $fh{$key} );
}

次の代わりに、次のこともお勧めします。

open( FH, "cat '$infile' | awk '{printf \"%s%s\",\$0,(NR%4?FS:RS)}' | " );

外部バイナリを使用してファイルを解析しているだけなので、おそらく perl 内で処理したほうがよいでしょう。(そしてレキシカル ファイルハンドルを使用します: `open ( $input, "-|, "cat '$infile' | awk '{printf \"%s%s\",\$0,(NR%4?FS:RS)}' " ) または警告 $!; )

于 2015-05-01T10:08:30.077 に答える