Если у вас есть только один диапазон и один, возможно, каскадный входной поток, вы можете использовать:
#!/usr/bin/perl -n
if (my $seqno = 1 .. 3) {
print;
exit if $seqno =~ /E/;
}
Но если вы хотите, чтобы он применялся к каждому входному файлу, вам нужно поймать конец каждого файла:
#!/usr/bin/perl -n
print if my $seqno = 1 .. 3;
close ARGV if eof || $seqno =~ /E/;
И если вы хотите быть добрыми к людям, которые забывают аргументы, добавьте приятное предупреждение в BEGIN
или INIT
предложении:
#!/usr/bin/perl -n
BEGIN { warn "$0: reading from stdin\n" if @ARGV == 0 && -t }
print if my $seqno = 1 .. 3;
close ARGV if eof || $seqno =~ /E/;
Известные пункты включают в себя:
Вы можете использовать -n
или -p
в строке #!
. Вы также можете поместить некоторые (но не все) другие ключи командной строки , например ‑l
или ‑a
.
Числовые литералы как
операнды к скалярному триггеру
оператор каждый сравнивается с
readline
счетчик, так что скаляр 1 ..
3
действительно ($. == 1) .. ($. ==
3)
.
Вызов eof
без аргумента и пустых паренов означает последний файл, прочитанный в списке magic ARGV
файлов. Это контрастирует с eof()
, который является концом всей <ARGV>
итерации.
Окончательный порядковый номер оператора триггера возвращается с добавлением "E0"
.
Оператор -t
, который вызывает libc isatty(3)
, по умолчанию использует дескриптор STDIN
- в отличие от любых других операторов проверки файлов.
Блок BEGIN{}
возникает во время компиляции, поэтому, если вы попытаетесь декомпилировать этот скрипт с помощью ‑MO=Deparse
, чтобы посмотреть, что он действительно делает, эта проверка будет выполнена. С INIT{}
не будет.
Именно это покажет, что неявный цикл ввода в виде метки называется LINE
, который вы, возможно, могли бы в других обстоятельствах использовать в своих интересах.
НТН