2

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

A 1
Z 2
C 3
L 2
E 4

和类似的另一组

1 K
4 I
2 P
5 R
6 S
7 U

现在我们可以找到在第一种情况下链接到并且类似地2Z第二组中链接到我们可以说并且被链接到 所以最初我已经生成了前两个步骤。我有点困惑如何进行休息?L2PZLP

4

6 回答 6

5

只是为了推荐一种截然不同的方法,如果您比 perl 更熟悉 SQL,可能更容易考虑,您可以查看DBD::CSV。然后,您可以使用简单的连接语句完成您想要的操作。只需按照链接页面上的示例进行操作即可。如果您不了解 SQL,那么使用已经发布的数组散列可能会更好。当我到达安装了 DBD::CSV 的机器时,我将发布实际代码......

于 2012-04-25T21:27:24.703 回答
3

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

这是一个执行此操作的示例程序。如果您需要不同的东西,请说明。

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";
}

输出

A => K
Z L => P
E => I
于 2012-04-25T23:41:13.847 回答
2
#!/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";
}

结果:

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
于 2012-04-25T21:51:59.397 回答
2

图形模块可以提供帮助。事实上,图论中的概念是思考这类问题的正确方法,而不是用哈希和数组来试图重新解决已经解决的问题。

#!/usr/bin/env perl

use strict; use warnings;
use Graph::Directed;
use Set::CrossProduct;

my $g = Graph::Directed->new;

my %first = qw(A 1 Z 2 C 3 L 2 E 4);
my %second = qw(1 K 4 I 2 P 5 R 6 S 7 U);

for my $h (\ (%first, %second) ) {
    $g->add_edge($_, $h->{$_}) for keys %$h;
}

print "All weakly connected components\n";

for my $wcc ( $g->weakly_connected_components ) {
    print "[@$wcc]\n";
}

my $it = Set::CrossProduct->new([ [keys %first], [values %second]]);

print "Connectedness tests\n";

while (my $case = $it->get) {
    my $is_connected = $g->same_weakly_connected_components(@$case);
    printf(
        "%s are %s in the same weakly connected component\n",
        "[@$case]", $is_connected ? '' : 'not'
    );
}

输出

所有弱连接组件

[R 5]
[E 4 我]
[K 1 A]
[2 ZLP]
[S 6]
[7U]
[C 3]

连通性测试

[ZS] 不在同一个弱连通分量
[ZI] 不在同一个弱连通分量中
[ZK] 不在同一个弱连接分量中
[ZU] 不在同一个弱连通分量
[ZP] 在同一个弱连通分量中
[ZR] 不在同一个弱连通分量中
[AS] 不在同一个弱连通分量中
[AI] 不在同一个弱连接分量中
[AK] 在同一个弱连接分量中
[AU] 不在同一个弱连接分量中
[AP] 不在同一个弱连接组件中
[AR] 不在同一个弱连接分量中
[CS] 不在同一个弱连通分量中
[CI] 不在同一个弱连接分量中
[CK] 不在同一个弱连接分量中
[CU] 不在同一个弱连接分量中
[CP] 不在同一个弱连通分量中
[CR] 不在同一个弱连通分量中
[ES] 不在同一个弱连接分量中
[EI] 在同一个弱连通分量中
[EK] 不在同一个弱连接分量中
[EU] 不在同一个弱连通分量中
[EP] 不在同一个弱连通分量中
[ER] 不在同一个弱连接分量中
[LS] 不在同一个弱连接分量中
[LI] 不在同一个弱连通分量中
[LK] 不在同一个弱连通分量中
[LU] 不在同一个弱连通分量中
[LP] 在同一个弱连接分量中
[LR] 不在同一个弱连接分量中
于 2012-04-26T01:11:35.557 回答
1

您可能希望使用数组的哈希来解决您的问题。例如,如果您已经知道 Z、L 和 P 是通过 2 连接的,并且您有这样的数据结构

my %hash_of_arrays = ( '2' => ['Z', 'L', 'P' ]);

已经。现在你发现'Q'也连接到'2'你会

push(@{hash_of_arrays{'2'}}, 'Q');

其他情况是当您遇到新的 $key 时,您可能希望将新数组插入哈希中:

my $array = []
$hash_of_arrays{$key} = $array

希望我理解你的正确...

于 2012-04-25T20:53:35.553 回答
0

你会想要一个数组的散列,这将需要使用数组引用。

#! /usr/bin/perl -w

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

my %HoA1;

for ( my $i = 0; $i < scalar @a1 - 1; $i++ ) {
    unless( defined $HoA1{ $a1[$i] } ) {
        $HoA1{ $a1[$i] } = [];
        push @{$HoA1{ $a1[$i] }}, $a1[$i+1];
    } else {
        push @{$HoA1{ $a1[$i] }}, $a1[$i+1];
    }
}

for my $key ( sort keys %HoA1 ) {
    print "$key: @{$HoA1{ $key }} \n";
}
于 2012-04-25T20:33:15.917 回答