0

我有两个数据文件:一个包含基因表达数据,另一个包含基因组注释数据。我必须比较一个文件的第 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

代码中的两个主要问题

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 回答