給定一組基因和現有的一對基因,我想生成一對尚未存在的新基因。從數字列表中生成隨機對,確保生成的隨機對不存在
的基因文件格式如下:
123
134
23455
3242
3423
...
...
的基因對文件的格式如下:
12,345
134,23455
23455,343
3242,464452
3423,7655
...
...
但我仍然得到known_interactions和new_pairs之間幾乎沒有共同之處。我不確定錯誤在哪裏。
對於參數,
perl的generate_random_pairs.pl entrez_genes_file known_interactions_file 250000
我的15880.一個共同的元素個數250000告訴我要多少隨機對程序產生。
#! usr/bin/perl
use strict;
use warnings;
if (@ARGV != 3) {
die "Usage: generate_random_pairs.pl <entrez_genes> <known_interactions> <number_of_interactions>\n";
}
my ($e_file, $k_file, $interactions) = @ARGV;
open (IN, $e_file) or die "Error!! Cannot open $e_file\n";
open (IN2, $k_file) or die "Error!! Cannot open $k_file\n";
my @e_file = <IN>; s/\s+\z// for @e_file;
my @k_file = <IN2>; s/\s+\z// for @k_file;
my (%known_interactions);
my %entrez_genes;
$entrez_genes{$_}++ foreach @e_file;
foreach my $line (@k_file) {
my @array = split (/,/, $line);
$known_interactions{$array[0]} = $array[1];
}
my $count = 0;
foreach my $key1 (keys %entrez_genes) {
foreach my $key2 (keys %entrez_genes) {
if ($key1 != $key2) {
if (exists $known_interactions{$key1} && ($known_interactions{$key1} == $key2)) {next;}
if (exists $known_interactions{$key2} && ($known_interactions{$key2} == $key1)) {next;}
if ($key1 < $key2) { print "$key1,$key2\n"; $count++; }
else { print "$key2,$key1\n"; $count++; }
}
if ($count == $interactions) {
die "$count\n";
}
}
}
在的問題,兩個文件中的數據efffectively與單曲chomped/\ S + \ž//'。你不應該在void上下文中使用'map':這就是'for'的用途。而C風格的'for'循環在C:use'for $ i(0.. $#基因){...}'或更好的情況下很少需要在數組的*內容*中使用'for我的$基因_i(@基因){...}' ' – Borodin 2012-08-14 02:10:30
@Borodin事實上,我站在糾正,沒有注意到\ z。然而for循環需要避免重複。我只是一個白癡,寫了$ k = 0而不是$ k = $ n。我堅持我的意見,就是要對互動對進行排序,以獲得獨特的名稱。 – terdon 2012-08-14 02:28:06
@Borodin我在這裏有點新,有沒有辦法可以PM你,所以我不偷OP的問題?如果你有時間,也許你可以解釋我在無效環境中使用的地圖。看到你的個人資料,我不懷疑它只是不明白:) – terdon 2012-08-14 02:31:59