While-Schleife mit If-Abfrage nach erstem Treffer beenden

Dieses Thema: "While-Schleife mit If-Abfrage nach erstem Treffer beenden" im Forum "Ruby, php, Perl, Python ..." wurde erstellt von Tamidor, 20.04.2006.

  1. #1 Tamidor, 20.04.2006
    Tamidor

    Tamidor Jungspund

    Dabei seit:
    18.04.2006
    Beiträge:
    12
    Zustimmungen:
    0
    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;}
    }
     
  2. Anzeige

    Schau dir mal diesen Ratgeber an. Viele Antworten inkl. passender Shell-Befehle!
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  3. #2 Leno, 20.04.2006
    Zuletzt bearbeitet: 27.04.2007
    Leno

    Leno -

    Dabei seit:
    26.10.2003
    Beiträge:
    139
    Zustimmungen:
    0
    -
     
  4. zyon

    zyon undeadlyBSD

    Dabei seit:
    03.11.2005
    Beiträge:
    333
    Zustimmungen:
    0
    Ort:
    Göttingen
    break; ?
     
  5. #4 Tamidor, 20.04.2006
    Zuletzt bearbeitet: 20.04.2006
    Tamidor

    Tamidor Jungspund

    Dabei seit:
    18.04.2006
    Beiträge:
    12
    Zustimmungen:
    0
    @ 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 :( :( :(
     
  6. #5 rikola, 20.04.2006
    Zuletzt bearbeitet: 20.04.2006
    rikola

    rikola Foren Gott

    Dabei seit:
    23.08.2005
    Beiträge:
    2.133
    Zustimmungen:
    0
    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...
     
  7. #6 Tamidor, 20.04.2006
    Tamidor

    Tamidor Jungspund

    Dabei seit:
    18.04.2006
    Beiträge:
    12
    Zustimmungen:
    0
    @ rikola
    Das ist guuuuuuuuuuuuuuuut :D

    Jetzt bleibt nur das problem, dass die Zeile eingefügt wird und nicht die alte ersetzt
     
  8. #7 Wolfgang, 20.04.2006
    Wolfgang

    Wolfgang Foren Gott

    Dabei seit:
    24.04.2005
    Beiträge:
    3.978
    Zustimmungen:
    0
    Ort:
    Erfurt
    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
     
  9. #8 Wolfgang, 20.04.2006
    Zuletzt bearbeitet: 20.04.2006
    Wolfgang

    Wolfgang Foren Gott

    Dabei seit:
    24.04.2005
    Beiträge:
    3.978
    Zustimmungen:
    0
    Ort:
    Erfurt
    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
     
  10. #9 Tamidor, 20.04.2006
    Tamidor

    Tamidor Jungspund

    Dabei seit:
    18.04.2006
    Beiträge:
    12
    Zustimmungen:
    0
    was bedeutet denn das g am ende der Suchmaske?

     
  11. #10 Wolfgang, 20.04.2006
    Wolfgang

    Wolfgang Foren Gott

    Dabei seit:
    24.04.2005
    Beiträge:
    3.978
    Zustimmungen:
    0
    Ort:
    Erfurt
    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
     
  12. #11 Tamidor, 20.04.2006
    Tamidor

    Tamidor Jungspund

    Dabei seit:
    18.04.2006
    Beiträge:
    12
    Zustimmungen:
    0
    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:
     
  13. #12 daniel.h, 26.04.2006
    daniel.h

    daniel.h IT-ler

    Dabei seit:
    24.01.2004
    Beiträge:
    493
    Zustimmungen:
    0
    Ort:
    Deutschland / Sindelfingen
    Das nehmen wir gerne als Kompliment auf, schön mal wieder so etwas zu hören :))
     
Thema:

While-Schleife mit If-Abfrage nach erstem Treffer beenden

Die Seite wird geladen...

While-Schleife mit If-Abfrage nach erstem Treffer beenden - Ähnliche Themen

  1. Per while-Schleife, SSh Verbindung aufbauen ( Nach 1 Server bricht er ab .. )

    Per while-Schleife, SSh Verbindung aufbauen ( Nach 1 Server bricht er ab .. ): Hallo, ich möchte mir per Script nacheinander an mehreren Servern anmelden und dort einen Befehl ausführen. ---------- #!/bin/sh while read...
  2. Fehler im Script (while-Schleife)

    Fehler im Script (while-Schleife): halli,hallo ich studiere gerade ein Buch unter anderem über Scripting. Habe ein Beispiel-Script angelegt. Ausführbar gemacht: #!/bin/bash...
  3. while-Schleifen

    while-Schleifen: Hallo, ich versuche mich gerade in einer verschachtelten while-Schleife. Warum wird die erste Schleife nur einmal durchlaufen? Was kann ich...
  4. Shell if-Abfrage mit equal or greater wirft Fehlermeldung unary operator expected

    Shell if-Abfrage mit equal or greater wirft Fehlermeldung unary operator expected: Hallo zusammen, ich habe ein Problem mit einem selbstgebauten Script. Edit 10:26: Pardon, es handelt sich um ein HP-UX Release B.11.23 U...
  5. simple if-abfrage

    simple if-abfrage: Hallo, Ich suche ne einfache If-abfrage (KSH). Möchte Dateien in ein Verzeichnis kopieren, welches von einem anderen Job angelegt wird. Wenn das...