2

いくつかのランダムなアルファベットと乱数を生成したとしましょう

A 1
Z 2
C 3
L 2
E 4

同様に別のセット

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

2これで、最初のケースではリンクされているZことがわかり、2 番目のセットでLも同様2にリンクされている ことがわかります。最初に最初の 2 つのステップを生成しました。私は少し混乱しています。PZLP

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/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'
    );
}

出力

すべての弱連結成分

[R5]
[E 4 I]
[K1A]
【2ZLP】
【S6】
【7U】
[C3]

接続性テスト

[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 に答える
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 に答える
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 に答える