Подтвердить что ты не робот

Какое использование <> в Perl?

Какое использование < > в Perl. Как это использовать? Если мы просто напишем

<>;

и

while(<>)

что делает программа в обоих случаях?

4b9b3361

Ответ 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, и он печатает значение в следующем выражении.