0

亲爱的 stackoverflow 社区,

我正在尝试根据以下内容使用基于网页的 curl 查找将条目添加到 tsv 文件:

#!/usr/bin/env perl

my $file = "TfbG_peaks2.tsv";
open(INFO, $file) or die("Could not open file.");
#my $VNG = "VNG1649G";
my $query = "(\<title\>)([A-Za-z0-9\- ]*)";
foreach $line (<INFO>) {
        $line =~ /(^VNG\w*)/;
        $VNG = $1;
        my $url = "http://www.ncbi.nlm.nih.gov/gene/?term=$VNG";
        my $page = `curl $url`;
        if ($page =~ /(\<title\>)(VNG)/) {
                $name = "hypothetical protein";
                $abbrev = " ";
                $longname = $name;
        }
        elsif ($page =~ /$query/) {
                $name = $2;
                $name =~ /^(\w+)(\s+)(([A-Za-z0-9\-]+\s*)+)/;
                $abbrev = $1;
                $longname = $3;
        }
        my @values = split('\t', $line);
        splice @values, 1, 0, $abbrev;
        splice @values, 2, 0, $longname;
        print join "\t", @values;
        print "\n";
} 

输入 tsv 数据文件的行看起来像

VNG1374G Chromosome 1022977 1023252 4.184852806 2.877295983 3.362660404 3.961922335 3.932399564

或者

VNGt26 Chromosome 1153828 1154334 4.879550683 3.730707809 5.515198268 5.30410069 5.328461226

我正在查找的网页的页面源代码中唯一包含<title> HTML 标记的行就像

<title>trn26 [Halobacterium sp. NRC-1] - Gene - NCBI</title>

对于具有 trn 名称和类似的条目

<title>gspE1 type II secretion system protein [Halobacterium sp. NRC-1] - Gene - NCBI</title>

或喜欢

<title>VNG1872C hypothetical protein [Halobacterium sp. NRC-1] - Gene - NCBI</title>

对于具有非 trn 名称的条目。

该代码适用于非 trn 名称,即打印类似

VNG0218G gspE1 type II secretion system protein Chromosome 186556 186979 4.072750978 2.233376793 2.684902216 3.714576271 3.52083442

或类似的东西

VNG2556H hypothetical protein Chromosome 1917796 1918082 3.778968581 2.582944032 2.981130347 3.940093432 4.286983604

但对于 trn 条目打印

VNGt26 <title> Chromosome 1153828 1154334 4.879550683 3.730707809 5.515198268 5.30410069 5.328461226

而不是预期的

VNGt26 trn26 Chromosome 1153828 1154334 4.879550683 3.730707809 5.515198268 5.30410069 5.328461226

为什么 trn 情况会有所不同?对于 trn 和非 trn 案例,网页源代码行的格式似乎相同,我不明白为什么我的正则表达式在这种情况下会失败。

另外,我是 Perl 的新手,所以欢迎任何关于组织或保持代码简洁明了的建议 :)。

非常感谢,

迈克尔

4

1 回答 1

5

$name =~ /^(\w+)(\s+)(([A-Za-z0-9\-]+\s*)+)/;不匹配,因此不会改变$1,$2等。

于 2013-06-01T18:24:30.103 回答