Archiv verlassen und diese Seite im Standarddesign anzeigen : While-Schleife mit If-Abfrage nach erstem Treffer beenden
So ich habe folgende Schleife gebastelt, die aus einer Datei eine Zahl (z.B 4.234) ausliest und abändert, der Rest soll einfach von der alten Datei übernommen werden, so dass ein Kopie der Datei entsteht bei der nur der eine Wert geändert wurde.
Problem ist nur, dass ich die Suchabfrage nicht so eindeutig gestalten kann, dass nur auf eine Zeile zutrifft. Ich weiss aber, dass die gewünschte Zahl IMMER vor allen anderen auf die Suchabfrage zutrifft. Das heisst ich möchte, dass die if Abfrage nur bis zum ersten Erfolg gilt und danach nur noch die else Option.
Sorry für die vielen Anfängerfragen, aber bei diesen spezielleren Problemen finde ich in den gängigen Internettutorials einfach die Antworten nicht. Wahrscheinlich, weil ich nicht genau wonach ich suchen muss. :hilfe2:
while ( $zeile = <INPUT> )
{
if ($zeile =~ /^(\d+\.\d+)\n/)
{
$alat = $1;
$alat = $alat*(0.9+(($i-1)*0.05));
print $alat, "\n";
print OPTIN $alat,"\n";
}
else {print OPTIN $zeile;}
}
@ Leno
das verstehe ich nicht so ganz.
@ zyaon
mit break beende ich doch die ganze Schleife, aber es soll ja schon die ganze Datei umkopiert werden, nur dass halt eine Zeile abgeändert werden soll.
gibt es denn keine Suchabfrage wie:
if ($zeile =~ /^(\d+\.\d+)\s+(\d+\.\d+)\n/) "das erste mal" und eben nur beim erstenmal ??
Ausserdem habe ich gerade festgestellt, dass bei meiner Lösung die Zeile nicht ersetzt wird, sonder eine Zeile mit dem geänderten Wert eingefügt wird. Danach folgt dann eine Zeile mit dem alten Wert.
Fragen über Fragen :( :( :(
Du kannst Dir vor Beginn der while-Schleife eine Variable
my $found = false; # mein perl ist nicht gut genug um zu garantieren, dass
#die Syntax korrekt ist.
definieren, fragst im if zusaetzlich ab, ob diese wahr oder falsch ist und setzt sie innerhalb des if-Blockes aus true.
/EDIT:
tschuldigt, voll das Joop-Deutsch...
@ rikola
Das ist guuuuuuuuuuuuuuuut :D
Jetzt bleibt nur das problem, dass die Zeile eingefügt wird und nicht die alte ersetzt
Wolfgang
20.04.2006, 11:55
Hallo
Es gibt viele Möglichkeiten sowas zu behandeln.
Eine sehr simple ist dabei einfach mit einem Statusflag zu arbeiten.
...
my $found=1; #Status initialisieren
...
# hier deine while schleife etc
if( (/^(\d+\.\d+)$/g) and ($found)){
#beide Bedingungen erfüllt =erster Fund
# do somewhat
...
$found--; #Zähler wird Null, =false;
#beim nächsten Fund treffen also nicht mehr beide Bedingungen zu.
}
else{ ...}
Der Code ist nur ein Fragment als Denkanstoß, um das Prinzip zu klären.
HTH
Gruß Wolfgang
Edit rikola war jetzt schneller, lass es trotzdem stehen
Wolfgang
20.04.2006, 12:01
@ rikola
Das ist guuuuuuuuuuuuuuuut :D
Jetzt bleibt nur das problem, dass die Zeile eingefügt wird und nicht die alte ersetzt
Hm
Das hatten wir doch schon im anderen Thread?
Modifizier einfach die Zeile im entsprechenden Block.
Den else Block kannst du weglassen.
Nach der Abfrage printest du die Zeile simpel aus.
Ist die Bedingung wahr, ist die Zeile geändert. sonst nicht.
Siehe auch mein Beitrag zu deiner gestrigen Frage
Hier (http://www.unixboard.de/vb3/showthread.php?goto=lastpost&t=19337)
Gruß Wolfgang
was bedeutet denn das g am ende der Suchmaske?
Hallo
Es gibt viele Möglichkeiten sowas zu behandeln.
Eine sehr simple ist dabei einfach mit einem Statusflag zu arbeiten.
...
my $found=1; #Status initialisieren
...
# hier deine while schleife etc
if( (/^(\d+\.\d+)$/g) and ($found)){
#beide Bedingungen erfüllt =erster Fund
# do somewhat
...
$found--; #Zähler wird Null, =false;
#beim nächsten Fund treffen also nicht mehr beide Bedingungen zu.
}
else{ ...}
Der Code ist nur ein Fragment als Denkanstoß, um das Prinzip zu klären.
HTH
Gruß Wolfgang
Edit rikola war jetzt schneller, lass es trotzdem stehen
Wolfgang
20.04.2006, 12:16
Hallo
Du solltest dich mal etwas mir Regexp vertraut machen.
Das g bedeutet, dass der gesamte Zeilenpuffer berücksichtigt wird.
Auch ist sowas
/^(\d+\.\d+)\n/ falsch.
besser so
/^(\d+\.\d+)$/
Das $ steht für Zeilenende. Das bedeutet, hier stehen von Anfang bis Ende nur Ziffern gefolgt von . (Punkt) gefolgt von Ziffern.
Gruß Wolfgang
Es funktioniert :D :D
Vielen Dank Euch allen, ist echt ein super Board.
Ich hab ein ganz schlechtes Gewissen, weil ich im Moment so wenig Ahnung habe, dass ich nur vom Wissen anderer profitiere aber nichts zurückgeben kann.
Ich arbeite aber dran, versprochen :brav:
daniel.h
26.04.2006, 17:41
Es funktioniert :D :D
Vielen Dank Euch allen, ist echt ein super Board.
Ich hab ein ganz schlechtes Gewissen, weil ich im Moment so wenig Ahnung habe, dass ich nur vom Wissen anderer profitiere aber nichts zurückgeben kann.
Ich arbeite aber dran, versprochen :brav:
Das nehmen wir gerne als Kompliment auf, schön mal wieder so etwas zu hören :))
Powered by vBulletin® Version 4.2.0 Copyright ©2013 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.