>>189
それ、あなたの期待する $_ もしくは @_ への代入が実行されてない。
以下が機能しないのと同じこと。
reverse 'foo' ;
print $_ . "\n" ;
print @_ . "\n" ;

reverse 関数は単独使用時に「左辺が指定されてなかったら $_ or @_ に代入する」
なんて機能を持ってない(つーか勝手にコンテキストの判断してもらっても困るw)。
foreach VAR ( LIST) BLOCK の場合は () 内のリストを暗黙の内に一個一個 $_ に
入れてくれるけど while ( EXPR ) BLOCK は、そんな器用なことはしてくれない。
() 内に条件式を必要とするだけ。
while ( <> ){ } は、あくまでも while ( defined ( $_ = <> ) ) { } の省略。

foreach と同一結果を得たければ、やはり一旦配列に突っ込むのが正攻法
@foo = reverse <> ;
while ( defined ( $_ = shift @foo ) ){ print $_ ; }

以下は見た目、正解っぽく感じるかも知れないが当然ダメ。
while ( defined ( $_ = reverse <> ) ){ print $_ ; }
別のお話しになってしまうので説明割愛。