Какое использование < > в Perl. Как это использовать? Если мы просто напишем
<>;
и
while(<>)
что делает программа в обоих случаях?
Какое использование < > в Perl. Как это использовать? Если мы просто напишем
<>;
и
while(<>)
что делает программа в обоих случаях?
Ответы выше, все правильно, но это может показаться более понятным, если вы понимаете общее использование командной строки UNIX. Очень часто требуется, чтобы команда работала над несколькими файлами. Например.
ls -l *.c
Командная строка оболочки (bash и др.) превращает это в:
ls -l a.c b.c c.c ...
Другими словами, ls никогда не видит '*.c', если шаблон не соответствует. Попробуйте это в командной строке (не perl):
echo *
вы заметите, что не получаете *.
Итак, если оболочка передаст вам кучу имен файлов, и вы хотите поочередно проходить через каждую информацию, оператор perl < > дает вам хороший способ сделать это... он ставит следующая строка следующего файла (или stdin, если имена файлов не указаны) в $_ (по умолчанию - скаляр).
Вот бедный человек grep:
while(<>) {
print if m/pattern/;
}
Запуск этого script:
./t.pl *
будет распечатывать все строки всех файлов, которые соответствуют данному шаблону.
cat /etc/passwd | ./t.pl
будет использовать cat для генерации некоторых строк текста, которые затем будут проверяться для шаблона по циклу в perl.
Итак, вы видите, в то время как (< > ) получает стандартное поведение командной строки UNIX... обрабатывает все файлы, которые я вам даю, или обрабатываю то, что я вам передал.
<>;
- это короткий способ записи
readline();
или если вы добавили аргумент по умолчанию,
readline(*ARGV);
readline
- это оператор, который считывает строку из указанного дескриптора файла. Чтение из специального дескриптора файла ARGV
будет считаться с STDIN
, если @ARGV
пуст или из конкатенации файлов с именем @ARGV
если это не так.
Что касается
while (<>)
Это синтаксическая ошибка. Если у вас
while (<>) { ... }
он переписывается на
while (defined($_ = <>)) { ... }
И как ранее объяснялось, это означает, что
while (defined($_ = readline(*ARGV))) { ... }
Это означает, что он будет читать строки из (ранее объясненные) ARGV
, пока не будет больше строк для чтения.
Цитирование perldoc perlop
:
Нулевой дескриптор файла < > является специальным: его можно использовать для эмуляции поведение sed и awk, а также любую другую программу фильтров Unix, которая принимает список имен файлов, делая то же самое для каждой строки ввода из всех их. Вход из < > поступает либо из стандартного ввода, либо из каждого файл, указанный в командной строке.
Он называется оператором алмаза и передает данные из любого stdin, если ARGV пуст или каждая строка из файлов, названных в ARGV. Эта веб-страница http://docstore.mik.ua/orelly/perl/learn/ch06_02.htm объясняет это очень хорошо.
Во многих случаях программирования с таким синтаксическим сахаром Deparse
O полезно узнать, что происходит:
$ perl -MO=Deparse -e 'while(<>){print 42}'
while (defined($_ = <ARGV>)) {
print 42;
}
-e syntax OK
он принимает стандартный вход STDIN:
> cat temp.pl
#!/usr/bin/perl
use strict;
use warnings;
my $count=<>;
print "$count"."\n";
>
ниже - выполнение:
> temp.pl
3
3
>
поэтому, как только вы выполните script, он будет ждать ввода пользователем некоторого ввода.
после 3
задается как вход, он сохраняет это значение в $count
, и он печатает значение в следующем выражении.