给定一组基因和现有的一对基因,我想生成一对尚未存在的新基因。从数字列表中生成随机对,确保生成的随机对不存在
的基因文件格式如下:
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