birgit: In Hash zwei Arrays einfügen u Ausgabe tätigen

Beitrag lesen

Halloo
ich habe ein Programm erstellt welches mir von zwei Directories bestimmte Files selektiert. Es werden hier dann zb. ein File aus Dir1 mit dem gleichen File aus Dir2 verglichen. Gibt es Werte die nicht übereinstimmen, werden diese in eine Txt-Datei übertragen.

Nun möchte ich aber, dass pro Datei mehr als ein Fehlerwert angezeigt wird.
Denn momentan schauts nur so aus.

Dir 1
hello.spi => 234
test.spi => 112

Dir 1
hello.spi => 235
test.spi => 111

Habs hierbei mal mit einem Hash probiert. Dh. die Filenamen (hello.spi) und die Werte (234) werden eingelesen.

nun gibt es aber zb. in der Datei test.spi einen weiteren Fehler, der wird jedoch nicht angzeigt. Die Ausgabe sollte wie folgt ausschaun:
test.spi => 111, 123

Ich wollte nun probieren die Werte als ein Array in den Hash einzulesen.
Aber hier komm ich einfach nicht weiter...

Viell. kann mir jemand behilflich sein, wär euch soooo dankbar!!!

  
my $sel_end="spi";  
  
my $dir = "@ARGV[0]";  
my @content0;  
my @liste_0;  
  
  
my $dir1 = "@ARGV[1]";  
my @content1;  
my @liste_1;  
  
my %HASH;  
  
opendir(DIR, "@ARGV[0]");  
opendir(DIR1, "@ARGV[1]");  
  
my @files0=readdir(DIR);  
my @files1=readdir(DIR1);  
  
  
foreach my $entry(@files0)  
{  # nach und nach die Einträge im Verzeichnis holen  
    my $path = "$dir/$entry";  
   # print "Dateipfad: $path\n";  
 if(-f $path)  
 {  
#  print "ARRAY: @files0\n";  
  
# Danach kommt ein split mit einem Punkt. Die Dateiendung ist der letzte Wert  
# des split (-1 ist ja immer der letzte Wert eines Arrays, also alles, was  
# hinter dem letzten . steht).  
  
  my $end=(split(/\./,$entry))[-1];  
  if($end eq $sel_end)  
  {  
#    print "Only $sel_end Files: $entry \n";  
  
   open(FILE,"<$dir/$entry")or die "file not found\n";  
   my @lines= <FILE>;  
    close (FILE);  
    push @content0, @lines;  
    delete $content0[0,1];  
  
    push @liste_0, $entry;  
  
    #print "LISTE0: @content0";  
#    print "liste0: @liste_0\n";  
  
  
    foreach my $entry1(@files1)  
    #while ($entry1 = readdir(DIR1))  
    {  # nach und nach die Einträge im Verzeichnis holen  
  
        my $path1 = "$dir1/$entry1";  
     if(-f $path1)  
     {  
     my $end1=(split(/\./,$entry1))[-1];  
      if($end1 eq $sel_end)  
      {  
       #print "ENTRY1: $entry1\n";  
  
       #print "Only $sel_end Files11: $entry1 \n";  
             #print "ARRAY11: $entry1\n";  
                   if ($entry ne $entry1)  
                   {  
                   next;  
                   }else  
                   # if ($entry eq $entry1)  
                   {  
#            print "ENTRY: $entry\n";  
#                   print "ENTRY1: $entry1\n";  
  
           open(FILE1,"<$dir1/$entry1")or die "file not found\n";  
           my @lines1= <FILE1>;  
           #my @content1;  
           close (FILE1);  
           push @content1, @lines1; # Array @content1 beinhaltet den Inhalt der Files, die verglichen werden sollen  
           delete $content1[0,1];  # Die ersten 2 Elemente des Arrays @content1 werden entfernt, da diese nur Kommentare sind  
           #print "LISTE1: @content1";  
  
           push @liste_1, $entry1;  
  
           print "ENTRY: $entry1\n";  
  
          }  
      }  
     }  
  
    }  
         my @content_0_1 = @content0;  # Array 1 minus Array 2;  
  
         for my $element (@content1) {  # Elemente des Arrays @liste_1  
                for my $index (0..$#content_0_1) { # Schleife über alle Indexe (Elemente) des Array liste_0_1 (=@liste_0)  
                    if ($element eq $content_0_1[$index]) { # Wenn ein Eintrag aus @liste_1 gleich dem Eintrag aus @liste_0 ($liste_0_1[$index] ist zB. text.txt) ist  
                        splice @content_0_1, $index, 1;  # splice (1. Name d. Arrays, 2. Indexnummer des Elements, ab dem gelöscht werden soll., Anzahl der zu löschenden Elemente)  
                        #last;        # Mit dem Befehl last kann die Schleife abgebrochen werden, wenn eine bestimmte Bedingung erfüllt ist  
                     ;  
  
                    }  
                }  
            }  
  
  
         my @content_1_0 = @content1;  # Array 2 minus Array 1;  
  
            for my $element (@content0) {  
                for my $index (0..$#content_1_0) {  
                    if ($element eq $content_1_0[$index]) {  
                        splice @content_1_0, $index, 1;  
                        #last;  
                    }  
                }  
            }  
  
  
            my %hash1;  
            my %hash2;  
  
          for my $i (0..$#liste_0)  
          {  
          $hash1{$liste_0[$i]}=$content_0_1[$i];  
            print $hash1;  
         }  
  
  
         for my $i (0..$#liste_1)  
         {  
          $hash2{$liste_1[$i]}=$content_1_0[$i];  
         }  
  
            open(DIFF,">diff_content.txt") || die("Can't open file\n");  
          print DIFF  "@ARGV[0]:\n";  
         print DIFF "$_ => $hash1{$_}" for keys %hash1;  
         print DIFF  "\n";  
         print DIFF  "\n";  
  
         print DIFF  "@ARGV[1]:\n";  
         print DIFF "$_ => $hash2{$_}" for keys %hash2;  
         print DIFF  "\n";  
 }  
 }  
 close(DIFF);  
  
  
}  
  
closedir(DIR1);  
closedir(DIR);