Aktuelle SeiteWähle Forum / Perl / Allgemeines zu Perl / Schleifen
Schleifen

Bin neu hier und hoffe auf zahlreiche Beiträge! Wünsche dem neuen Forum alles Gute, und hoffe das sich Rechtschreibfehler, wie auf der Startseite, oder die Formatfehler in den Anzeigen zu den Kinderkrankheiten zälen und bald ausgestanden sind.
Nun aber zu meinem Problem:
Gegeben:
Datei 1, Datei2
identische Strings innerhalb beider Dateien
nun sollen die srings aus Datei1 in Datei2 gesucht und ausgeben werden.
open...
while ($mystring1 = <IN1>) {
Anweisungstext zur Stringsuche
while $mystring2 = <In2>) {
Anweisungstext zur Stringsuche
if string1 eg string2 { print $string1; }
}
}
close...
Soweit sogut- oder so schlecht- von der Überlegung her:
Den Perl gibt mir nur die erste Zeile aus,
dann alle zeile der datei2,
dann alle zeilen der datei1.
Wo ist mein Denkfehler?
der logik nach muss doch string in datei1 gesucht werden, denn die komplette datei2 danach durchwühlt werden, und das solange bis datei1 beendet ist.
Trackback URL für diesen Beitrag:
- Anmelden oder Registrieren um Kommentare zu schreiben
- 487 Aufrufe
-

davon abgesehen, dass dein code nicht mal kompiliert und anscheinend eher zusammengewürfelte variabennamen benutzt (du liest in $mystring1 ein, willst aber nachher aus $string1 lesen (und vergisst auch noch das dollarzeichen), ist der ansatz nicht gerade effizient, für jede zeile in datei eins nochmals alle zeilen aus datei 2 zu lesen. der algorithmus hat quadratische komplexität. ausserdem musst du natürlich, wenn du einmal eine datei ausgelesen hast, mittels seek erst wieder an den anfang zurückspringen, um sie nochmals auslesen zu können.
# ungetestet
open my $fh1, "<", $file1 or die $!;
open my $fh2, "<", $file2 or die $!;
my %seen = map { $_ => 1 } <$fh1>;
while (my $line = <$fh2>) {
print $line if $seen{$line}++;
}
perl-community.de - das forum mit wiki, scripts und grosser FAQ
der code sollte nur symbolhaft mein anliegen verdeutlichen.
sehe ich das richtig, dass es sich hierbei um eine rekursion handelt?
bei $string1 handelt es sich um einen substring aus $mystring1.
von daher ist diese rauch ausgebbar.
von effizienz habe ich auch nicht gesprochen. zumal mich das bei ca 800
Zeile ablosut nicht intressiert.
werde mir das beispiel aber mal zu hilfe nehmen. ist ja nicht die erste Programmiersprache die ich lerne.
Also irgendwie is obiger code einfach zu chinesisch für mich.
kann mir mal bitte einer einem anfänger die zeilen ausführlich, step-by-step, erklären?
Wäre nett, danke!
Achso: bitte keine Lösungen nach Array- das wäre in meinem Fall zu statisch!
bisher hatte ich was ähnliches programmiert- aber das ist wohl ne völlig unsaubere programmierung. hierzu mal mein bis heriger ansatz dazu. der ein oder andere wird merken das ich von der grundstruktur aus turboPascal herraus agiere.
#---<test1>---------------------------------------
#!/C:\strawberry\perl\bin\perl -w
sysopen(IN1,"datei1.txt",O_RDONLY) or die "Datei1 weg!"; # Datei1 öffnen
open(OUT1,'>'."tmp1.txt"); # Ausgabe nach Datei tmp.txt
{ chop(); # Zeilentrenner raus
$myString1 = $_; # Var Programmstart
while ($myString1 = <IN1>) { # Schleife Zeile
$art1 = substr ($myString1, 0, 2); # ersten beiden Zeichen
if (substr ($art1, 0, 1) ne "*") { # Kommentare löschen
#
# hier werden aus aus $myString1, was einer zeile entspricht, einzelne strings ausgelesen,
# geprüft und neu angeordnet und in eine neue Datei geschrieben.
# Bsp: $art1 = substr ($myString1, 0, 2); # ersten beiden Zeichen bestimmen
# if (substr ($art1, 0, 1) ne "*") { # wenn1. zeichen kein stern * dann
# } # zeile berücksichtigen
print OUT1 " \r\n"; # summe aus print- befehlen } # endif (substr ($art1, 0, 1) ne "*")
} # endwhile
close(OUT1); # Datei schließen
close(IN1); # Datei schließen
} # ProgrammEnde
Meinste das so?
#!/C:\strawberry\perl\bin\perl -wuse warnings;
use strict;
open(IN1,"datei1.txt") or die "Datei1 weg!";
open(OUT1,">tmp1.txt");
my $myString1;
while ($myString1 = <IN1>) {
chomp($myString1);
my $art1 = substr($myString1, 0, 2);
if (substr($art1, 0, 1) ne "*") {
print OUT1 "$art1\r\n";
}
}
close(OUT1);
close(IN1);