Schrift
[thread]6225[/thread]

grep soll mehr finden

Leser: 4


<< >> 9 Einträge, 1 Seite
mordur
 2004-04-30 13:14
#81932 #81932
User since
2003-09-25
182 Artikel
BenutzerIn
[Homepage] [default_avatar]
moins,
ich möchte das grep mehr als
ein Muster in einem Array findet.
Ich versuche es so,
aber das klappt nicht so richtig.


if(grep(/$row->[0] and $row->[1] and $row->[2]/,@fehler))

{
print "Deine Muster sind im Array \n";
}
else
{
print "Im Array wurde $row->[0],
$row->[1] und $row->[2] nicht gefunden! \n";
}



Es wird immer irgendwie der else-zweig ausgeführt,
obwohl im Array alle drei Elemente '$row'
vorkommen. Der if Zweig soll nur laufen,
wenn alle drei '$row'
auch vorkommen im Array.
Dabei dürfen sie gern in verschiedenen
Arrayelementen stehen.

???
Crian
 2004-04-30 13:53
#81933 #81933
User since
2003-08-04
5870 Artikel
ModeratorIn
[Homepage]
user image
Was ist $row, bzw. was hat es mit @fehler zu tun?
Was sollen die Slashes?

Edit: meinst Du vielleicht sowas wie

Code: (dl )
grep(/\Q$row->[0]\E/ and /\Q$row->[1]\E/ and /\Q$row->[2]\E/, @fehler)


?


Edit 2:

[quote=mordur,30.04.2004, 11:14]Dabei dürfen sie gern in verschiedenen
Arrayelementen stehen.[/quote]
Das wird dann so nicht gehen. Da musst Du wohl dreimal greppen


Code: (dl )
1
2
3
if (grep(/\Q$row->[0]\E/, @fehler) and
grep(/\Q$row->[1]\E/, @fehler) and
grep(/\Q$row->[2]\E/, @fehler)) {...}
\n\n

<!--EDIT|Crian|1083319107-->
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
format_c
 2004-04-30 13:56
#81934 #81934
User since
2003-08-04
1706 Artikel
HausmeisterIn
[Homepage] [default_avatar]
probier mal
grep($_ eq $row->[0] && $_ eq $row->[1] && $_ eq $row->[2],@fehler)
Gruß Alex
Edit: or in && geändert
Edit2: Ok Crian hat recht, hab nicht genau gelesen.\n\n

<!--EDIT|format_c|1083319226-->
Crian
 2004-04-30 13:59
#81935 #81935
User since
2003-08-04
5870 Artikel
ModeratorIn
[Homepage]
user image
Nö, soll ja alles drei erfüllt sein, dabei reicht es, wenn eines einmal vorkommt.

eq ist was anderes als // ^^

Da kommt es jetzt drauf an, was der OP möchte. Identität von Arrayelementen mit den Elementen aus @$row oder aber enthalten sein...

Edit 3: ;)\n\n

<!--EDIT|Crian|1083319261-->
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
mordur
 2004-04-30 14:30
#81936 #81936
User since
2003-09-25
182 Artikel
BenutzerIn
[Homepage] [default_avatar]
[quote=Crian,30.04.2004, 11:53]
Code: (dl )
1
2
3
if (grep(/\Q$row->[0]\E/, @fehler) and
grep(/\Q$row->[1]\E/, @fehler) and
grep(/\Q$row->[2]\E/, @fehler)) {...}
[/quote]
so scheint mir geht es.
Also im Array steht z.B:
@fehler=("a","123","1","b","123","2",.

..);
und :
$row->[0]="a";
$row->[1]="123";
$row->[2]="1";

Beim Vergleich soll eben was passieren wenn der Inhalt der '$row' mit den ersten drei Elementen des Arrays übereinstimmt ODER mit den zweiten drei ODER ....

was bedeutet \Q und \E ?
Taulmarill
 2004-04-30 15:00
#81937 #81937
User since
2004-02-19
1750 Artikel
BenutzerIn

user image
\Q und \E quoten sonderzeichen.
alles was in den // steht is ein regex, also ein regulärer ausdruck. da können sonderezichen wie .*[] etc. spezielle bedeutungen haben. da du aber nur nach einem string suchst, schaltet man das am besten ab.
alles was zwischen \Q und \E steht wird dann als normaler string behandelt.

siehe perldoc perlre
$_=unpack"B*",~pack"H*",$_ and y&1|0& |#&&print"$_\n"for@.=qw BFA2F7C39139F45F78
0A28104594444504400 0A2F107D54447DE7800 0A2110453444450500 73CF1045138445F4800 0
F3EF2044E3D17DE 8A08A0451412411 F3CF207DF41C79E 820A20451412414 83E93C4513D17D2B
Crian
 2004-04-30 15:07
#81938 #81938
User since
2003-08-04
5870 Artikel
ModeratorIn
[Homepage]
user image
Wenn Du echte Übereinstimmung haben möchtest, solltest Du die eq-Variante nehmen:

Code: (dl )
1
2
3
if (grep($_ eq $row->[0], @fehler) and
grep($_ eq $row->[1], @fehler) and
grep($_ eq $row->[2], @fehler)) {...}
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
betterworld
 2004-04-30 18:42
#81939 #81939
User since
2003-08-21
2614 Artikel
ModeratorIn

user image
Es geht auch mit nur einem Durchlauf:
Code: (dl )
1
2
3
4
5
6
7
my @treffer;
for (@fehler) {
for my $i (0..2) {
$treffer[$i]=1 if /$row->[$i]/;
}
}
print "Deine Muster sind im Array" if $treffer[0] && $treffer[1] && $treffer[2];
\n\n

<!--EDIT|betterworld|1083336222-->
DS
 2004-05-01 03:00
#81940 #81940
User since
2003-08-04
247 Artikel
BenutzerIn
[default_avatar]
Ähm, das liest sich für mich so als sollte es genau in der selben Reihenfolge vorkommen, deswegen brauch ma da a bisserl was anderes. Mein Vorschlag:

Code (perl): (dl )
1
2
3
4
5
6
7
8
my $gefunden;
foreach my $i (0..$#fehler-2) {
  if ( $fehler[$i]   eq $row->[0] &&
       $fehler[$i+1] eq $row->[1] &&
       $fehler[$i+2] eq $row->[2]
     ) { $gefunden = 1; last }
}
if ( $gefunden ) {...}

Wenn $row nicht immer genau 3 Elemente hat dann macht man halt innen auch eine Schleife hin, würde wohl auch schöner ausschaun. :cool:

Hoffentlich hab' ich da nix falsch aufgefasst...

Edit: Die Bedingung beim if aufgespaltet, sowas mag ich eigentlich gar ned... ;)\n\n

<!--EDIT|DS|1083366212-->
<< >> 9 Einträge, 1 Seite



View all threads created 2004-04-30 13:14.