Problem mit verschachtelter For-Schleife


chill0r55555

Mitglied
Hallo,

ich habe ein Denkproblem mit einem Perl Skript und komme deshalb nicht weiter.


Und zwar habe ich 2 Dateien:

user1.txt & user2.txt


user1.txt hat den Inhalt:
Code:
harald:/tmp
otto:/home/otto
klaus:/tmp
karl:/opt
user2.txt hat den Inhalt:
Code:
harald:
otto:

Nun möchte ich die Dateien mit einander vergleichen, also wenn die Namen von user2.txt
in user1.txt vorkommen soll nix gemacht werden, und wenn nicht dann soll eine Datei beschrieben werden.

Mein Skript sieht so aus:

Code:
#!/usr/bin/perl -w

  use strict;
    my @array;
    my @array2;
    my @tempArray1 = ();
    my @tempArray2 = ();
	 my $count=0;
	 my $datei;
	 my $x;
	 my $z;


	open ($datei, '<', "user1.txt") or die $!;
	while(<$datei>)
	{
	  # Zeichen am Zeilenende löschen
	  chomp;
	  @array = split(/:/, $_);
	  $tempArray1[$count++] = $array[0];
	}
	close $datei;
	$count = 0;
	open ($datei, '<', "user2.txt") or die $!;
	while(<$datei>)
	{
		  # Zeichen am Zeilenende löschen
		  chomp;
		  @array2 = split(/:/, $_);
		  $tempArray2[$count++] = $array2[0];
	}
	close $datei;
	

  for(my $x=0; $x <= $#tempArray2; ++$x)
  {
		for(my $z=0; $z <= $#tempArray1; ++$z)
		{
			# Übereinstimmung
			if($tempArray1[$z] ne $tempArray2[$x])
			{
				#system ("echo '".$tempArray1[$z]."' >> juhu.txt");
			}
		}
  }
Meine juhu.txt sieht aber nun leider wie folt aus:

Code:
otto
klaus
karl
harald
klaus
karl

Da ja im ersten Durchlauf der äusseren For-Schleife x=1 ist wird nur der Benutzer
harald ausgeschieden und danach dann der Benutzer otto. Jedoch steht nun wenn x=2 der Benutzer
harald in dem neuen "Block" der Datei juhu.txt. Ich würde es aber gerne so haben,
dass alle User aus user2.txt nicht in die juhu.txt eingetragen werden. In der juhu.txt sollen
dann auch keine User doppelt drin stehen. Ich steh grade echt auf dem Schlauch. Ich hoffe es war
verständlich und mir kann einer helfen? Vorweg schonmal danke.

MfG
chill0r55555
 

Mark

Cinema4D
Hi!

Verzeih, wenn ich Dich mißverstehe und ich bin mir auch nicht sicher, ob's wirklich elegant ist (in Perl kann man sowas ja häufig in nur einer Zeile "abhandeln" ;) ):
kannst Du nicht ein Hash mit den Namen als Keys füllen und den Value folgend nutzen?
Code:
my %user;

open ($datei, '<', "user1.txt") or die $!;
while(<$datei>)
{
    chomp;
    my @array = split(/:/, $_);
    $user{$array[0]} = 1;
}
close $datei;

open ($datei, '<', "user2.txt") or die $!;
while(<$datei>)
{
    chomp;
    my @array = split(/:/, $_);
    $user{$array[0]} += 2;
}
close $datei;
    
foreach (keys %user) {
    if ($user{$_} == 1) {
        print $_ . " nicht in text 2";
    } elsif ($user{$_} == 2) {
        print $_ . " nicht in text 1";
    }
}
... nur mal als Idee / Anregung ...? :)

Liebe Grüße,
Mark.
 

chill0r55555

Mitglied
Also ich habe das ganze mal getestet. Scheint so zu funktionieren wie ich das hinbekommen wollte. Ich danke dir recht herzlich. Also auf das Thema Hash währe ich nie gekommen. Da ich noch nicht so der Profi Programmierer bin :rolleyes:. Aber aufjedenfall Danke.


MfG
chill0r55555