2013-04-07 3 views
1

Я сделал следующий сценарий:Почему я не могу завершить цикл while?

print "Will accept input until EOF"; 

while(defined($line = <STDIN>)){ 
    print "Input was $line \n"; 
    if(chomp(@line) eq "end"){ 
     print "aha\n"; 
     last; 
    } 
} 

У меня 2 вопроса:

  1. Почему, когда я печатаю end в консоли я не могу видеть aha и break из цикла (last является равным от break справа)?
  2. Что такое EOF ключ-комбинация для остановки цикла while? Я думал, что это ctrl+D в Windows, но это не работает.
+1

Вы не должны написать его как 'в то время как (определение ($ строка = )) {...} '; Perl добавит для вас ['defined'] (http://perldoc.perl.org/functions/defined.html" perldoc -f defined "). (Начиная с 5.12 он будет делать это для ['readdir'] (http://perldoc.perl.org/functions/readdir.html« perldoc -f readdir »)) –

+0

@BradGilbert: +1 для подсказки! Благодаря! – Cratylus

ответ

6

Ваш скрипт пропускает use strict; use warnings;. В противном случае вы заметили бы, что $line не @line.

Кроме того, chomp не возвращает измененную строку, она меняет ее на место и возвращает количество удаленных символов.

В MSwin, Ctrl + ZEnter используется в качестве EOF.

Обновление: Исправлено EOF.

+0

Если я использую только 'use warnings;' я не получаю предупреждение для своего типа '@ line' вместо' $ line'. Если я использую также 'use strict', я получаю:' Глобальный символ '$ line "требует явного пакета name at input.pl строка 6 Глобальный символ «$ line» требует явного имени пакета в строке input.pl 7 Глобальный символ «@line» требует явного имени пакета в строке input.pl 8' – Cratylus

+0

Также 'ctrl + D'' введите 'ничего не делает. Я использую' Windows 7'. Я получаю 'Input was ♦' – Cratylus

+1

Для окон попробуйте ввести ctrl + z –

3

Я изменил код:

use strict; 
use warnings; 

print "Will accept input until EOF"; 

while(my $line = <STDIN>){ 
    chomp $line; 
    print "Input was $line\n"; 
    if($line eq 'end'){ 
     print "aha\n"; 
     last; 
    } 
}