Почему этот шаблон не соответствует данным, которые моя программа считывает из STDIN? - PullRequest
0 голосов
/ 15 февраля 2010

Предположим, есть список, который вводится с консоли, используя <STDIN>

@string = <STDIN>;

Теперь я проверяю шаблон, скажем /manu/, в моей программе

foreach (@string)
{
    if(/manu/)
    {
        print $_."\n";
    }
}

Код не может найти шаблон /manu/.

Однако, когда я делаю следующее, код работает отлично:

chomp(@string = <STDIN>);

Почему?

Ответы [ 3 ]

9 голосов
/ 15 февраля 2010

Редактировать: Мой первоначальный ответ был написан при условии, что отправленный код был кодом, который использовал ОП. Обновлено после исправления.

Вот что я получаю при запуске:

#!/usr/bin/perl

use strict; use warnings;

my @string = <STDIN>;

for (@string) {
    if(/manu/) {
        print "'$_'";
    }
}

Выход:

E:\> t
manu
nana
tada
^Z
'manu
'

Обратите внимание на Control-Z , который я использую для сигнализации EOF из командной строки в Windows (если вы используете оболочку * nix, вы бы использовали Control-D ).

Вывод появляется только после того, как ваша программа прочитает все данные, которые она может прочитать из STDIN.

Обратите внимание на перевод строки после manu. Это потому, что я не chomp ввода. Это единственная разница между использованием этого кода и использованием

chomp(my @string = <STDIN>)

Когда вы вначале присваиваете <STDIN> массиву и перебираете его, ваша программа будет ждать, пока не останется больше данных для чтения и ее использование памяти будет пропорционально количеству полученных данных .

С другой стороны, следующая программа будет обрабатывать строки по мере их поступления:

/manu/ and print while <>;

и использование памяти будет пропорционально самой длинной полученной строке.

Строка выше эквивалентна:

while ( <> ) {
    if ( /manu/ ) {
        print $_;
    }
}

Обратите внимание, что вы всегда должны добавлять use strict; и его близкого друга use warnings; в свои сценарии. См. Perldoc Strict .

3 голосов
/ 15 февраля 2010

В вашем первом примере @list не определено. Если бы вы имели

use strict;
use warnings;

в вашем сценарии (настоятельно рекомендуется!) Perl сказал бы вам об этом.

Редактировать: Теперь, когда вы это исправили, у меня работает код, который у вас есть.

0 голосов
/ 15 февраля 2010

chomp отрывает любые пробелы или cr / lfs. Добавьте chomp или любой другой пробел к вашему совпадению с регулярным выражением, например:

foreach (@string)
{
    if(/manu\s*/)
    {
        print $_."\n";
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...