Hallo korkak,
das hier:
perl -nE "print if /morgenstund/ ? $c=2 : --$c > 0"
macht das, was Du ursprünglich haben wolltest, sehr elegant. (Habe ich doch gesagt, dass noch etwas schöneres kommt ;-)
Was in Deiner Interpretation noch fehlt, ist das erste
if, welches die eigentliche Prüfung macht, ob die Zeile ausgegeben werden soll oder nicht. Das besondere an Raubtiers Lösung ist ja gerade die Verschachtelung der beiden konditionalen Operationen.
Also, zuerst die innere Bedingung mit
$ ::
- Wenn SUCHWORT gefunden wird:
- Setze $c=2.
- Der Rückgabewert einer erfolgreichen Zuweisung ist true!
- Wenn SUCHWORT nicht gefunden wird:
- Setze $c=$c-1 und prüfe zugleich, ob das Ergebnis größer als null ist
- Wenn ja, ist der Rückgabewert true, wenn nein, ist er false
Dann die äußere Bedingung mit
if:
- Ist der Rückgabewert des $ :-Ausdrucks true?
- Wenn ja, wird die Zeile mit print ausgegeben, sonst nicht.
Und dann würde ich auch noch die letzte Feststellung korrigieren: Der Trenner wird dann ausgegeben, wenn
$c genau 0 ist, denn 0 ist in Perl
false. In den nächsten Zeilen wird SUCHWORT ja vielleicht auch nicht gefunden, dann wird
$c eine (immer weiter wachsende) negative Zahl und somit nicht mehr
false sondern
true.
HTH
Grüße
payx