親愛なるスタックオーバーフロー コミュニティへ
次のように、Webページベースの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タグを含む、私が探しているWebページのページソースの唯一の行は次のようなものです
<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 のケースが異なるのはなぜですか? Web ページのソース行は、trn の場合とそうでない場合で同じようにフォーマットされているように見えますが、この場合に正規表現が失敗する理由がわかりません。
また、私は Perl を初めて使用するので、編成やコードをクリーンで簡潔に保つための提案は大歓迎です :)。
どうもありがとう、
マイケル