While-Schleife mit If-Abfrage nach erstem Treffer beenden

T

Tamidor

Jungspund
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 :( :( :(
 
Zuletzt bearbeitet:
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...
 
Zuletzt bearbeitet:
@ rikola
Das ist guuuuuuuuuuuuuuuut :D

Jetzt bleibt nur das problem, dass die Zeile eingefügt wird und nicht die alte ersetzt
 
Hallo
Es gibt viele Möglichkeiten sowas zu behandeln.
Eine sehr simple ist dabei einfach mit einem Statusflag zu arbeiten.

Code:
...
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
 
Tamidor schrieb:
@ 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
Gruß Wolfgang
 
Zuletzt bearbeitet:
was bedeutet denn das g am ende der Suchmaske?

Wolfgang schrieb:
Hallo
Es gibt viele Möglichkeiten sowas zu behandeln.
Eine sehr simple ist dabei einfach mit einem Statusflag zu arbeiten.

Code:
...
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
 
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:
 
Tamidor schrieb:
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 :))
 

Ähnliche Themen

Last mit etc/passwd anzeigen lassen

bash: Fehlermeldung und Werte in Array sortieren?

while-Schleifen

Problem mit if in der while Schleife...

Server-Monitoring mit RRDTool

Zurück
Oben