2009-08-02 6 views
0

Ich habe 10 Arrays, die jeweils aus ähnlichen Arten von Werten bestehen. Ich möchte Teilmenge dieser Werte (erfassen Sie nur die Ziffern) von jedem Array und vergleichen Sie es dann mit Teilmenge von anderen Array. Außerdem möchte ich den Zahlenwert von Werten aus beiden Arrays nur dann erfassen, wenn es keinen Strich im Wert gibt (d. H. 2EF = Capture '2', aber wenn 45F- dann nichts erfasst, gehe zum nächsten Wert).Wie erfassen und vergleichen Sie Teilmengen von Werten aus verschiedenen Arrays?

_ DATA _

@ array1 = (-, 1EF, 2DG, 3GF, 4F-, -, .... 99GY);

@ array2 = (-, 1EF, 2DF, 3SD, 4DE, -, .... 99HK);

Beliebige zwei Arrays von 10 können gleichzeitig verglichen werden. Also, ich habe sie in einem Array '@allarrays' gespeichert und es zum Vergleich durchlaufen. Im folgenden Skript kann ich die Ziffer des ersten Arrays perfekt erfassen, aber ich kann die Ziffern nicht mit dem zweiten Array vergleichen. Der Wert von $ digit1 (entsprechend @ array1) wird in $ digit2 (entsprechend @ array2) kopiert. Irgendwelche Vorschläge auf was geht schief?

sub compareArrays { 
    my @array = @_; #passes an array @allarray which has @array1, @array2 [email protected] 
     for (my $p=0; $p<10; $p++){ # since total number of arrays is 10 
      for (my $r=$p+1; $r<10; $r++){ #to compare arrays 
      for (my $q=0; $q<$colsInArray; $q++){ 
       my $string1= $array[$p][$q]; 
       my $string2= $array[$r][$q]; 

       #array1 
        $string1=~ /(\d+)[A-Z]+/; 
       my $digit1 = $1; #capture digit part of array value 
       print "array1: $digit1\n"; #works fine, prints captured $digit1         
       #array2 
       $string2=~ /(\d+)[A-Z]+/; 
       my $digit2 = $1; 
       print "array2: $digit2\n"; #does not capture the value in $digit2, instead copies $digit1 

       if ($digit1 == $digit2){ 
       print "$digit1 : $digit2\n"; 
       }     
      } 

      } 
     } 
} 

_ UPDATE _ Aufruf compareArrays als:

&compareArrays(@allarrays); 
+0

Und was ist @allarrays? Da das, was Sie gepostet haben, grundsätzlich funktioniert, müssen Sie ein ausführbares Beispiel veröffentlichen, einschließlich der Initialisierung der Arrays, damit wir sehen können, welcher Teil nicht funktioniert. – ysth

Antwort

1

Wenn ich Ihren Testcode verwenden, wird der Wert in $ digit2 nicht erfassen. Sie können uns zeigen, wie Sie compareArrays aufrufen.

Sie sollten überprüfen, ob die Regex vor dem Zugriff auf $ 1 übereinstimmt; Wenn der Regex fehlgeschlagen ist, bleibt $ 1 aus dem vorherigen Spiel übrig. Sie haben nichts, um Werte mit - zu überspringen. die Ziffern sind immer am Anfang, gefolgt von nur Großbuchstaben Angenommen, Sie sowohl die

mit den Worten kombinieren könnten
my ($digit1) = $string1 =~ /^([0-9]+)[A-Z]+\z/ or next; 
+0

@ysth: Ich habe alles für $ digit1 kommentiert, um zu sehen, ob Regex für $ digit2 funktioniert. Beim Drucken von $ digit2 ist klar, dass der Regex funktioniert. Aber wenn ich kombiniere, hat $ digit2 den gleichen Wert wie $ digit1. Ich habe auch aktualisiert, wie ich compareArrays anrufe. – shubster

+0

@ysth: Ich habe $ string1 = ~/(\ d +) [A-Z] + /; meine $ digit1 = $ 1; mit dem, was du oben geschrieben hast. Ersetzen Sie es mit Ihrem Ausdruck scheint den Zweck zu lösen. Aber ich bin mir nicht sicher warum? Trotzdem danke! :) – shubster

1

Um ein Array zu einem Unterprogramm zu übergeben, müssen Sie einen Verweis:

vergleichenArrays (\ allarrays);

Verwandte Themen