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