Как моя Perl-программа получает стандартный ввод в Linux? - PullRequest
0 голосов
/ 24 сентября 2010

Я довольно новичок в программировании на Perl, но у меня достаточно опыта работы с Linux. Допустим, у меня есть следующий код:

while(1) {
        my $text = <STDIN>;
        my $text1 = <STDIN>;
        my $text2 = <STDIN>;
} 

Теперь основной вопрос: читает ли STDIN в Perl напрямую из / dev / stdin на машине с Linux или мне нужно передать / dev / stdin в скрипт Perl?

Ответы [ 3 ]

2 голосов
/ 24 сентября 2010

Если вы ничего не передаете в сценарий, он будет сидеть и ждать, пока вы что-то введете.Когда вы это сделаете, он будет помещен в $text, а затем скрипт продолжит ждать, пока вы что-то введете.Когда вы это сделаете, это войдет в $text1.Впоследствии скрипт снова будет ждать, пока вы что-то введете.Как только это будет сделано, входные данные перейдут в $text2.Затем все будет повторяться бесконечно.

Если вы вызываете скрипт как

$ script < input

, где input - файл, скрипт будет читать строки из файла, аналогичного приведенному выше,затем, когда поток закончится, начнется присвоение undef каждой переменной на бесконечный промежуток времени.

AFAIK, не существует языка программирования, где чтение с предопределенного STDIN (или stdin) дескриптор файла требует, чтобы вы вызывали вашу программу как:

$ script < /dev/stdin
1 голос
/ 24 сентября 2010

STDIN в Perl по умолчанию просто подключен к стандартному дескриптору входного файла. Кроме того, Perl на самом деле не волнует, откуда и откуда берутся данные. Это то же самое, что и в Perl, если вы читаете вывод из канала, перенаправляете файл или печатаете в терминале интерактивно.

Если вам небезразлична каждая из этих ситуаций и вы хотите обращаться с каждой из них по-разному, то вы можете попробовать разные подходы.

1 голос
/ 24 сентября 2010

Читает напрямую из файлового дескриптора STDIN. Если вы запустите этот скрипт, он просто будет ждать ввода; если вы передадите ему данные, он будет зациклен до тех пор, пока все данные не будут использованы, а затем будет ждать вечно.

Вы можете изменить это на:

while (my $test = <STDIN>) {
   # blah de blah
}

поэтому EOF завершит вашу программу.

...