PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : While-Schleife mit If-Abfrage nach erstem Treffer beenden



Tamidor
20.04.2006, 11:31
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
20.04.2006, 11:37
-

zyon
20.04.2006, 11:37
break; ?

Tamidor
20.04.2006, 11:39
@ 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 :( :( :(

rikola
20.04.2006, 11:45
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...

Tamidor
20.04.2006, 11:49
@ 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

Tamidor
20.04.2006, 12:03
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

Tamidor
20.04.2006, 12:22
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 :))