Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]7500[/thread]

Vergleich: zweier Arrays und ihrer Elemente

Leser: 2


<< |< 1 2 3 >| >> 23 Einträge, 3 Seiten
Gast Gast
 2005-11-28 02:45
#60450 #60450
Hallo an alle;
bin ein absoluter Quereinsteiger und Perl Anfänger und habe Probleme bei einer Schleife:
ich habe 2 Arrays indem ich ein Vergleich durchführen muss, ist auch eigentlich kein Problem.
Meine Schleife muss die Zeilen der Arrays vergleichen und wenn die ersten Elemente gleich sind soll es die restlichen elemente vergleichen.
ich habe das problem so gelöst indem ich immer die Positionen der Elemente der beiden Arrays verglichen und ausgegeben habe. Aber da habe ich ein riesen langen Code. Und mit AoA mit einer if schleife habe es auch nicht hinbekommen. Es muss doch ein einfachen Weg geben ??? Kann jemand meinen schlaflosen nächten ein Ende geben?? :-/
lichtkind
 2005-11-28 04:19
#60451 #60451
User since
2004-03-22
5697 Artikel
ModeratorIn + EditorIn
[Homepage]
user image
hm klingt etwas ungenau aber ich vermute das in deinen arrays-zellen jewails eine zeile text drin ist. ich weiss aber nicht wie man bei solch einfache aufgabe von denen du sprichst seitenlangen code schreiben kann. oder hab ich missverstanden und es viel komplizierter als:
Code: (dl )
if ($array1[0] eq $array2[0])

dann solltest du dir auch perl fähigkeit arrays nativ zu traversieren genau anschaun. for (@array) {} klappert von allein einen array ab und wenn du 2 vergleichst kann man:
Code: (dl )
1
2
3
for (0..$#array1) {
if ($array1[$_] eq $array2[$_]) {...}
}

zb aber ich glaub da kommt doch nochwas was die aufgabe schwerer macht?
Wiki:Tutorien in der Wiki, mein zeug:
kephra, baumhaus, garten, gezwitscher

Es beginnt immer mit einer Entscheidung.
Crian
 2005-12-01 14:58
#60452 #60452
User since
2003-08-04
5872 Artikel
ModeratorIn
[Homepage]
user image
vorher sollte man testen, ob die Arrays gleich groß sind...

Code: (dl )
die "boese" unless @array1 == @array2;
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
Taulmarill
 2005-12-01 16:10
#60453 #60453
User since
2004-02-19
1750 Artikel
BenutzerIn

user image
oder einfach die schleife auf das kleinste array begrenzen

Code: (dl )
1
2
3
4
my @foo = qw/0 1 2 3 4 5 6 7 8 9/;
my @bar = qw/0 1 2 3 4 5/;
my $last = @foo < @bar ? @foo : @bar;
print "$last\n";
$_=unpack"B*",~pack"H*",$_ and y&1|0& |#&&print"$_\n"for@.=qw BFA2F7C39139F45F78
0A28104594444504400 0A2F107D54447DE7800 0A2110453444450500 73CF1045138445F4800 0
F3EF2044E3D17DE 8A08A0451412411 F3CF207DF41C79E 820A20451412414 83E93C4513D17D2B
SD6
 2005-12-09 03:29
#60454 #60454
User since
2005-12-09
7 Artikel
BenutzerIn
[default_avatar]
Danke euch für euere Vorschläge recht herzlich. bekomme es aber nicht hin :( ich versuch mal mit 'nem Beispiel deutlicher zu werden. Also habe zB 2 Dateien mit folgendem Inhalt, die ich @A1=split (" ", $file1,5); ausgebe:

Datei 1:                                    Ausgabe:                Datei 2:

q1 lm1 lm9 above -                     Bla1 : q1                 q3 lm3 lm5 front likely
q2 lm2 lm8 below directly             Bla2 : lm1                q1 lm1 lm9 above -
q4 lm4 - between like                  Bla3 : lm9
                                              Bla4 : above
                                              Bla5 : -

bevor ich euch den Vergleichscode zeige den ich mal so simple geschrieben habe  :blush: möchte ich schriftlich mitteilen was ich erreichen möchte:
ich möchte das erste element im Array mit dem zweiten Element vergleichen und wenn Sie gleich sind, soll er die restlichen elemente Vergleichen und sie ausgeben.


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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
foreach my $x (@A1)
{
foreach my $y (@A2)
{
if ($A1[0] eq $A2[0]) # Bla1
{
if ($A1[1] eq $A2[1]) # für Bla2
{

print"\nIm $A1[0]: \n";

print "\ngemeinsame Bla2 : 1. $A1[1] 2. $A2[1]\n";

$x++;
}
else
{

print "\nBla2 nicht gleich: $A1[1]  $A2[1]\n";

$y++;
}

if ($A1[2] eq $A2[2]) # für Bla3
{

print "gemeinsame Bla3 : 1. $A1[2] 2. $A2[2]\n";

$x++;
}
else
{

print "\nBla3 nicht gleich $A1[2] $A2[2]\n";

$y++;
}

if ($A1[3] eq $A2[3]) # für Bla4
{

print "gemeinsame Bla4 : 1. $A1[3] 2. $A2[3]\n";

$x++;
}
else
{

print "\nBla4 nicht gleich $A1[3]  $A2[3]\n";

$y++;
}

if ($A1[4] eq $A2[4]) # für Bla5
{

print "gemeinsame Bla5 : 1. $A1[4] 2. $eA2[4]\n";

}
else
{

print "\nBla5 nicht gleich  $A1[4] $A2[4]\n";

}
}

}
}


es funktioniert nicht so wie ich es möchte. Freue mich jetzt schon auf die Kritik. Vielen Dank !\n\n

<!--EDIT|renee|1134112419-->
SD6
 2005-12-09 03:38
#60455 #60455
User since
2005-12-09
7 Artikel
BenutzerIn
[default_avatar]
Da habe ich Quark geschrieben:

"ich möchte das erste element im Array mit dem zweiten Element vergleichen und wenn Sie gleich sind, soll er die restlichen elemente Vergleichen und sie ausgeben."

Das erste Element von der ersten zeile des ersten Array vergleiche ich mit dem ersten Element der ersten zeile des zweiten Arrays.....usw

aber das sieht Ihr ja schon vom Code ...;-)      
(Peinlich, also manchmal schäme ich mich schön solche fragen zu stellen)
renee
 2005-12-09 09:18
#60456 #60456
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Darf ich fragen, was eigentlich das Ziel ist? Soll es Ziel sein, herauszufinden, ob es identische Zeilen in den Dateien gibt oder soll am Ende herausgefunden werden, ob bei beiden Dateien jeweils die erste Zeile gleich ist oder etwas ganz anderes?

Nach Deinen Beispieldateien und der Ausgabe zu urteilen sollen gleiche Zeilen gefunden werden und von diesen jeweils die einzelnen "Worte" ausgegeben werden...
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
Crian
 2005-12-09 16:15
#60457 #60457
User since
2003-08-04
5872 Artikel
ModeratorIn
[Homepage]
user image
Das klingt nach einem Teilproblem zwischen B und C in einer Problemkette A-B-C-D für die Perl eine elegante Direktlösung A-D bereithält... =)\n\n

<!--EDIT|Crian|1134137783-->
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
SD6
 2005-12-12 04:49
#60458 #60458
User since
2005-12-09
7 Artikel
BenutzerIn
[default_avatar]
Aber sicher doch renee....Ziel der teilaufgabe ist das jedes wort in jeder zeile (jede zeile hat nur 5 wörter) verglichen und ausgegeben werden soll.
zB beinhaltet
datei 1: a(erstes element ist meistens eine nummernblock der dem ersten element der zweiten datei gleich ist) b c d e
           ............
           ............
datei 2: a b c f e
           ............
           ............
und ausgabe soll wie folgendes aussehen:


In a ist:

Bla1(muss in Bla1 gespeichert werden da ich es später in eine formel einsetzten muss)      b(von datei1)   b(von datei2) gleich
Bla2                                                                                                                   c                   c                  gleich
Bla3                                                                                                                   d                   f                  ungleich
Bla4                                                                                                                   e                   e                  gleich

in x ist:
Bla1......................................
...........................................

........
..............................................usw

ich hoffe das ich es bisschen klarer beschrieben habe

MFG SD6
esskar
 2005-12-12 05:36
#60459 #60459
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
[quote=SD6,12.12.2005, 03:49]ich hoffe das ich es bisschen klarer beschrieben habe[/quote]
nö.
<< |< 1 2 3 >| >> 23 Einträge, 3 Seiten



View all threads created 2005-11-28 02:45.