Perl: читать из <> - PullRequest
       38

Perl: читать из <>

2 голосов
/ 07 декабря 2011

Что делает чтение из <> в Perl?Например, что будет делать следующее?

print for(<>);

Ответы [ 3 ]

8 голосов
/ 07 декабря 2011

Так называемый оператор ромба (<>) считывает построчно (в скалярном контексте) из STDIN или имена файлов, заданные в качестве аргументов командной строки.

Из perldoc perlop:

Нулевой файловый дескриптор <> является особенным: его можно использовать для эмуляции поведения sed и awk.Ввод из <> поступает либо из стандартного ввода, либо из каждого файла, указанного в командной строке.Вот как это работает: при первом вычислении <> проверяется массив @ARGV, а если он пуст, $ARGV[0] устанавливается на "-", что при открытии дает стандартный ввод.Массив @ARGV затем обрабатывается как список имен файлов.


В контексте списка <> возвращает все строки, причем каждая строка сохраняется как элемент в списке.

Это означает, что print for <>; будет делать то же самое, что и print while <>;, хотя и с большим объемом памяти.

3 голосов
/ 07 декабря 2011

Вы нашли самый волшебный кусок Perl.Ну, я уверен, что есть больше магических вещей, но эта маленькая идиома делает очень легким для написания программ, предназначенных для использования в конвейере оболочки и файловых операций.

При запуске без каких-либо аргументов <> будет читать строки по одному за раз из стандартного ввода.

При запуске с аргументами он будет обрабатывать аргументы как имена файлов ичитать строки по очереди из названных файлов по очереди.

Короткая демонстрация:

$ cat > print.pl
#!/usr/bin/perl -w
print for(<>);
$ chmod 755 print.pl 
$ echo hello world | ./print.pl 
hello world
$ ./print.pl print.pl 
#!/usr/bin/perl -w
print for(<>);
$ ./print.pl print.pl print.pl
#!/usr/bin/perl -w
print for(<>);
#!/usr/bin/perl -w
print for(<>);
$ 

Я набрал там программу вручную;нажмите ^D, когда вы введете его полностью.

0 голосов
/ 07 декабря 2011

Он читает со стандартного ввода, по одной строке за раз, и сохраняет его в $_. print затем распечатывает $_ по умолчанию, так как ему не дан аргумент. Эта программа читает со стандартного входа и эхосигналов на стандартный вывод, пока не достигнет EOF.

...