0

2 つのデータ ファイルがあります。1 つは遺伝子発現データ、もう 1 つはゲノム アノテーション データです。1 つのファイルの列 1 と列 2 の値を比較する必要があり、1 > 2 の場合は、その行と注釈データ ファイルの同じ行にある refseq id を出力します。

これまでのところ、両方のファイルを読み取り用に開いています。

#!usr/bin/perl
use strict;
use warnings;

open (my $deg, "<", "/data/deg/DEG_list.txt") or die $!;
open (my $af "<", "/data/deg/Affy_annotation.txt") or die $!;

# I want to store data in hash

my %data;
while (my $records = <$deg>) {
  chomp($records);

  # the first line is labels so we want to skip this
  if($records =~ /^A-Z/) {
    next;
  else {
    my @columns = split("/\s/", $records);

    if ($columns[2] > $columns[1]) {
      print $records;
    }
  }
}

これが発生するたびに行を印刷したいのですが、他のデータファイルにある遺伝子 ID も印刷したいと考えています。これを行う方法がわかりません。また、行を印刷するだけではないという点で、現在のコードは機能していません。

4

2 に答える 2

1

あちこちで括弧が欠落していることに加えて、あなたの問題はおそらくあなたの正規表現です

if($records =~ /^A-Z/) {

これは、このリテラル文字列で始まる行を検索します。たとえばA-Zfoobar、ご想像のとおり、大文字で始まる文字列は検索しません。あなたはおそらく欲しい:

if($records =~ /^[A-Z]/) {

角かっこは、範囲が内部にある文字クラスを示します。

また、単一の空白で分割することも知っておく必要がありsplit /\s/, ...ます。これは、余分な空白ごとに空のフィールドを作成するという点で、希望どおりではない場合があります。明示的に単一の空白で分割したい場合を除いて、おそらく

split ' ', $records;

これは、複数の連続する空白で分割され、先頭の空白を削除します。

于 2013-02-06T04:15:54.147 に答える
0

コードの 2 つの主な問題

if($records =~ /^A-Z/) ...

行頭の文字を検出したい場合は、

if($records =~ /^[a-z]/i) ... starting with any letter
if($records =~ /^[A-Z]/) ...  starting with big letter

そして、

my @columns = split("/\s/", $records);

正規表現はここでは文字列です...(引用されているため)、正規表現に引用符を削除させる

my @columns = split(/\s/, $records);

ただし、スペースが複数ある場合でもフィールドを分割したい場合は、

my @columns = split(/\s+/, $records);

代わりは。

于 2013-02-06T08:20:14.517 に答える