Maik: grep Problem!!

Hallo miteinander,

möchte folgendes realisieren:

Ich habe 2 Array. Diese möchte ich einander abgleichen.

Wenn aus Array 1, genannt @Liste  nicht im Array 2 (@pop_array) vorhanden ist, dann soll der Eintrag ausgegeben werden!

Script:

while(@Liste) {
        unless (grep(/$Liste[0]/, @pop_array)) {
               print "$Liste[0]\n";
        }
}

Das funktioniert ja wunderbar. Jedoch bin ich jetzt auf folgendes Problem gestoßen:

Wenn in Array @pop_array ein Eintrag names "test10" vorhanden ist und in Liste "test1", dann behauptet das Programm, dass test1 vorhanden wäre, da der Teilstring ja existiert. Ne Idee wie ich das lösen könnte????

Danke

  1. Hi!

    while(@Liste) {
            unless (grep(/$Liste[0]/, @pop_array)) {
                   print "$Liste[0]\n";
            }
    }
    Wenn in Array @pop_array ein Eintrag names "test10" vorhanden ist

    unless (grep(/^$Liste[0]$/, @pop_array)) {

    Also mit ^ am Anfang und $ am Ende der Regex. Warum eigentlich $Liste[0]?? Dann sucht er ja jedesmal das erste Feld des ersten Arrays. Sollte es nicht $_ heißen??

    Gruß

  2. use Mosche;

    unless (grep(/$Liste[0]/, @pop_array)) {

    Wenn in Array @pop_array ein Eintrag names "test10" vorhanden ist und in Liste "test1", dann behauptet das Programm, dass test1 vorhanden wäre, da der Teilstring ja existiert. Ne Idee wie ich das lösen könnte????

    Ich verstehe nicht, warum du überhaupt eine Regex benutzt.
    Außerdem ist dein Code, wie er dasteht, wahrscheinlich nicht das, was du haben willst:

    for my $k (@Liste) {
       unless (grep { $_ eq $k } @pop_array){
          print "$_ nicht vorhanden\n";
        }
    }

    Folgendes habe ich verändert:

    1. Bei grep wird jetzt mit dem aktuellen Element der Liste @Liste verglichen. Du hast immer mit dem ersten verglichen.

    2. Ich verwende hier 'eq' statt einer Regex, das verhindert das Verhalten, welches du beschreibst. Außerdem ist es deutlich schneller als der Code von alguien.

    use Tschoe qw(Matti);

    --
      Anyone who quotes me in their sig is an idiot. -- Rusty Russell.