首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用perl建立两个变量之间的关系,类似于代谢网络

如何使用perl建立两个变量之间的关系,类似于代谢网络
EN

Stack Overflow用户
提问于 2012-04-26 04:27:23
回答 5查看 178关注 0票数 2

假设我生成了一些随机字母表和随机数

代码语言:javascript
复制
A 1
Z 2
C 3
L 2
E 4

类似地,另一组

代码语言:javascript
复制
1 K
4 I
2 P
5 R
6 S
7 U

现在我们可以发现,在第一种情况下,2链接到ZL,类似地,2链接到第二个集合中的P,从这里我们可以说ZL连接到P,所以我已经生成了前两个步骤。我有点困惑,如何继续rest?

EN

回答 5

Stack Overflow用户

发布于 2012-04-26 05:27:25

如果您更熟悉SQL而不是perl,那么只需推荐一种非常不同的方法,这种方法可能更容易考虑,您可以研究DBD::CSV。然后,您可以使用一个简单的join语句来完成您想要的操作。只需遵循链接页面上的示例即可。如果您不了解SQL,那么您最好使用已发布的数组散列。当我到达一个安装了DBD::CSV的机器时,我会发布实际的代码...

票数 5
EN

Stack Overflow用户

发布于 2012-04-26 07:41:14

也许您需要的是所有的关系,就像您向我们展示的那样?

下面是一个执行此操作的示例程序。如果你需要不同的东西,请解释一下。

代码语言:javascript
复制
use strict;
use warnings;

my %data1 = qw(
  A 1
  Z 2
  C 3
  L 2
  E 4
);

my %data2 = qw(
  1 K
  4 I
  2 P
  5 R
  6 S
  7 U
);

#  Convert to arrays indexed by the numbers
#
my @data1;
push @{ $data1[$data1{$_}] }, $_ for keys %data1;

my @data2;
push @{ $data2[$_] }, $data2{$_} for keys %data2;

# Find all the mappings between the datasets
#
for my $i (0 .. $#data1) {
  my $data1 = $data1[$i] or next;
  my $data2 = $data2[$i] or next;
  print "@$data1 => @$data2\n";
}

输出

代码语言:javascript
复制
A => K
Z L => P
E => I
票数 3
EN

Stack Overflow用户

发布于 2012-04-26 05:51:59

代码语言:javascript
复制
#!/usr/bin/perl -w
use strict;
use Data::Dumper;
my (@n,@s);

sub generate_random_string
{
    my @chars=('a'..'z');
    my $random_string;
    $random_string.=$chars[rand @chars];
    return $random_string;
}

print "one\n";
foreach(1..5)
{
    my $range = 10;
    my $random_number = int(rand($range));
    push (@n,$random_number);
    my $random_string=&generate_random_string;
    push(@s,$random_string);
    print $random_number." ".$random_string."\n";
}
my (@nn,@ss);
print "two\n";
foreach(1..6)
{
    my $range = 10;
    my $random_number = int(rand($range));
    push (@nn,$random_number);
    my $random_string=&generate_random_string;
    push(@ss,$random_string);
    print $random_number." ".$random_string."\n";
}

my %h1;

# prepare data
for (my $i=0;$i<=$#n;$i++)
{
    $h1{$i}{'a'}=$s[$i];
    $h1{$i}{'i'}=$n[$i];
}
my %h2;
for (my $i=0;$i<=$#nn;$i++)
{
    $h2{$i}{'a'}=$ss[$i];
    $h2{$i}{'i'}=$nn[$i];
}
# end prepare data

my %result;

foreach (keys %h2)
{
    my $letter=$h2{$_}{'a'};
    my $number=$h2{$_}{'i'};
    my @rarr;
    foreach (keys %h1)
    {
    if ($h1{$_}{'i'}==$number)
        {
            push(@rarr,$h1{$_}{'a'});
        }
    }
    if ($#rarr>=0)
    {
        @{$result{$letter}}=@rarr;
    }
    @rarr=undef;
}
foreach (keys %result)
{
    print join(',',@{$result{$_}})." connected to ".$_."\n";
}

结果:

代码语言:javascript
复制
one
8 s
2 g
6 z
7 g
7 a
two
7 e
8 w
3 r
1 c
0 t
7 h
a,g connected to e
s connected to w
a,g connected to h
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10323222

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档