Ich war so frei und habe Deine (Fast)-Lösung etwas verallgemeinert. ;-)
Das Problem ist, dass Du mit $a=<STDIN> eine Zeile einliest - inklusive Zeilenumbruch. Wenn Du also "ENDE" eingibst und mit Return bestätigst, ist ein $a der Text "ENDE\n" gespeichert. Der Vergleich von "ENDE\n" mit "ENDE" schlägt dann natürlich fehl.
Grüße
Tobias Nopper
Lehrstuhl für Betriebssysteme