假设我生成了一些随机字母和随机数
A 1
Z 2
C 3
L 2
E 4
和类似的另一组
1 K
4 I
2 P
5 R
6 S
7 U
现在我们可以找到在第一种情况下链接到并且类似地2
在Z
第二组中链接到我们可以说并且被链接到
所以最初我已经生成了前两个步骤。我有点困惑如何进行休息?L
2
P
Z
L
P
假设我生成了一些随机字母和随机数
A 1
Z 2
C 3
L 2
E 4
和类似的另一组
1 K
4 I
2 P
5 R
6 S
7 U
现在我们可以找到在第一种情况下链接到并且类似地2
在Z
第二组中链接到我们可以说并且被链接到
所以最初我已经生成了前两个步骤。我有点困惑如何进行休息?L
2
P
Z
L
P
只是为了推荐一种截然不同的方法,如果您比 perl 更熟悉 SQL,可能更容易考虑,您可以查看DBD::CSV。然后,您可以使用简单的连接语句完成您想要的操作。只需按照链接页面上的示例进行操作即可。如果您不了解 SQL,那么使用已经发布的数组散列可能会更好。当我到达安装了 DBD::CSV 的机器时,我将发布实际代码......
也许你需要的是所有的关系,就像你向我们展示的那样?
这是一个执行此操作的示例程序。如果您需要不同的东西,请说明。
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
#!/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
图形模块可以提供帮助。事实上,图论中的概念是思考这类问题的正确方法,而不是用哈希和数组来试图重新解决已经解决的问题。
#!/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] 不在同一个弱连接分量中
您可能希望使用数组的哈希来解决您的问题。例如,如果您已经知道 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
希望我理解你的正确...
你会想要一个数组的散列,这将需要使用数组引用。
#! /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";
}