Какое использование <> в Perl?
Какое использование < > в Perl. Как это использовать?
Если мы просто напишем
<>;
и
while(<>)
что делает программа в обоих случаях?
Ответы
Ответ 1
Ответы выше, все правильно, но это может показаться более понятным, если вы понимаете общее использование командной строки 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... обрабатывает все файлы, которые я вам даю, или обрабатываю то, что я вам передал.
Ответ 2
<>;
- это короткий способ записи
readline();
или если вы добавили аргумент по умолчанию,
readline(*ARGV);
readline
- это оператор, который считывает строку из указанного дескриптора файла. Чтение из специального дескриптора файла ARGV
будет считаться с STDIN
, если @ARGV
пуст или из конкатенации файлов с именем @ARGV
если это не так.
Что касается
while (<>)
Это синтаксическая ошибка. Если у вас
while (<>) { ... }
он переписывается на
while (defined($_ = <>)) { ... }
И как ранее объяснялось, это означает, что
while (defined($_ = readline(*ARGV))) { ... }
Это означает, что он будет читать строки из (ранее объясненные) ARGV
, пока не будет больше строк для чтения.
Ответ 3
Цитирование perldoc perlop
:
Нулевой дескриптор файла < > является специальным: его можно использовать для эмуляции поведение sed и awk, а также любую другую программу фильтров Unix, которая принимает список имен файлов, делая то же самое для каждой строки ввода из всех их. Вход из < > поступает либо из стандартного ввода, либо из каждого файл, указанный в командной строке.
Ответ 4
Он называется оператором алмаза и передает данные из любого stdin, если ARGV пуст или каждая строка из файлов, названных в ARGV. Эта веб-страница http://docstore.mik.ua/orelly/perl/learn/ch06_02.htm объясняет это очень хорошо.
Ответ 5
Во многих случаях программирования с таким синтаксическим сахаром Deparse
O полезно узнать, что происходит:
$ perl -MO=Deparse -e 'while(<>){print 42}'
while (defined($_ = <ARGV>)) {
print 42;
}
-e syntax OK
Ответ 6
он принимает стандартный вход STDIN:
> cat temp.pl
#!/usr/bin/perl
use strict;
use warnings;
my $count=<>;
print "$count"."\n";
>
ниже - выполнение:
> temp.pl
3
3
>
поэтому, как только вы выполните script, он будет ждать ввода пользователем некоторого ввода.
после 3
задается как вход, он сохраняет это значение в $count
, и он печатает значение в следующем выражении.