Thread perlfaq4 - How do I compute the difference of: three arrays? (5 answers)
Opened by pktm at 2006-07-10 20:11

topeg
 2006-07-11 08:14
#68029 #68029
User since
2006-07-10
2611 Artikel
BenutzerIn

user image
Achso. Ich dachte es würde reichen, wenn ein Wert in zwei Arrays vorkommt. Wenn der Wert in allen dreien vorkommen soll muß der Code so aussehen:

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#!/usr/bin/perl
use strict;
use warnings;

my @a1 = qw{ abc def 123 456 };
my @a2 = qw{ abc 123 789 };
my @a3 = qw{ def ghi 123 000 };

my @zusammen=sort(@a1,@a2,@a3);

my @neu=();

my $alt="";
my $cnt=1;
while(@zusammen>0)
{
my $wert=shift(@zusammen);
if($alt eq $wert)
{ $cnt++ }
else
{
push(@neu,$alt)if($cnt==3);
$cnt=1;
}
$alt=$wert;
}

print "#### VORGABE ####\n@a1\n@a2\n@a3\n#### ERGEBNIS ####\n@neu\n";


Zu deinem Code.
Als erstes wird ein Hash mit den Einträgen aller Arrays als Schlüsselnamen erstellt, wenn er nicht existiert, und um 1 hochgezählt. Man bekommt allso ein Hash in dem die Werte der Arrays als Schlüssel enthalten sind und die Anzahl der Einträge über alle Arrays. Danach wird nurnoch gezählt wie häufig ein Wert vorkam und der Wert wird entweder in @intersection oder in @difference geschrieben.
Das ist Übrigens dein Beispiel mit drei Arrays:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
my @array1 = qw(mitteldeutschem mitteldeutsches mitteleuropaeisch mitteleuropaeische);
my @array2 = qw(mitteldeutschem mitteldeutsches);

my @union = ();
my @intersection = ();
my @difference = ();
my %count = ();

foreach my $element (@array1, @array2, @array3) { $count{$element}++ };

foreach my $element (keys %count) {
push @union, $element;
push @{ $count{$element} > 2 ? \@intersection : \@difference }, $element;
}

View full thread perlfaq4 - How do I compute the difference of: three arrays?