Флаги Perl -pe, -pi, -p, -w, -d, -i, -t?

107

Я видел множество способов запуска кода или скриптов Perl с разными флагами. Однако, когда я пытаюсь найти в Google значение каждого флага, я в основном получаю результаты для общих сайтов Perl, и никакой конкретной информации о флагах или их использовании там не обнаружено.

Ниже приведены флаги, с которыми я сталкиваюсь чаще всего, и я понятия не имею, что они означают:

  • perl -pe
  • perl -pi
  • perl -p
  • perl -w
  • perl -d
  • perl -i
  • perl -t

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

Тюдор Константин
источник
21
Поиск в Google простых ответов о perl часто приводит вас к действительно бесполезным сайтам. всегда сначала проверяйте собственную документацию perl.
ysth
3
Прикомандированный. В этом случае perldoc perlrunесть список всех параметров командной строки, которые принимает Perl.
Шерм Пендли
1
Проблема Google: знак минус интерпретируется Google как означающий «исключить этот термин». Чтобы избежать такого поведения, заключите термин, содержащий знак минус, в кавычки.
Роджер Крюгер

Ответы:

147

Да, Google , как известно , трудно отрываясь знаки препинания и, к сожалению, Perl делает похоже, в основном состоит из знаков препинания :-)

Все параметры командной строки подробно описаны в perlrun . (доступно из командной строки, вызвавperldoc perlrun )

Вкратце перейдем к вариантам, один за другим:

-p: помещает цикл печати вокруг вашей команды, чтобы она действовала на каждом
    строка стандартного ввода. Используется в основном, чтобы Perl мог превзойти
    срывает awk с точки зрения мощности и простоты :-)
-n: помещает непечатаемую петлю вокруг вашей команды.
-e: позволяет вам указать программу в качестве аргумента.
    чем в файле. Вы не хотите создавать сценарий
    файл для каждого маленького однострочника Perl.
-i: изменяет ваш входной файл на месте (делая резервную копию
    оригинал). Удобно изменять файлы без {copy,
    удалить оригинал, переименовать} процесс.
-w: активирует некоторые предупреждения. Любой хороший программист Perl будет использовать это.
-d: запускается под отладчиком Perl. Для отладки кода Perl,
    очевидно.
-t: обрабатывает определенный "испорченный" (сомнительный) код как предупреждения (собственно
    taint mode приведет к ошибке в этом сомнительном коде). Раньше говядину
    повысить безопасность Perl, особенно при запуске кода для других
    пользователей, таких как сценарии setuid или веб-файлы.
Paxdiablo
источник
1
Я не заметил, что вы упомянули perldoc perlrun. Я удалил свой ответ. :-)
Алан Хаггай Алави
4
-wна самом деле обычно следует избегать, поскольку он позволяет выводить предупреждения для всего кода, включая модули CPAN, которые не были написаны с учетом предупреждений. Результаты в целом довольно шумные, а также довольно бесполезные.
duskwuff -inactive -
9
-wобычно избегают, но его следует заменить use warningsв вашем собственном коде.
plusplus
6
@duskwuff: В целом я согласен, и я делаю это use warningsв своем собственном коде, но -w действительно используется - он помогает отсеять плохо написанные модули CPAN. :-)
Sherm Pendley
2
@IanBytchek Аргументы, которые могут / должны принимать дополнительный параметр, не могут находиться внутри сжатого списка. -iпринимает расширение для резервного копирования. -eпринимает команду Perl. В -0ep вы говорите Perl , что «р» является командой Perl вместо аргумента. Это вообще не сработает.
tjd
10

-pФлаг в основном запускает скрипт с

while (<>) {
# exec here
}
continue {
    print or die "-p destination: $!\n";
}

-e позволяет передать скрипт в STDIN

perl -e '$x = "Hello world!\n"; print $x;'

-iуказывает интерпретатору, что все данные, передаваемые STDINисполняющимся скриптом, должны выполняться на месте.

-wто же самое use warnings;, но в глобальной, а не локальной области

-d запускает отладчик Perl

Zellio
источник
2
-wне совсем то же самое use warnings, что и последнее, привязано к локальному файлу
plusplus
plusplus, правда, патченный ответ.
zellio
2
Передача скрипта в качестве аргумента - это не то же самое, что передача его в STDIN. -i берет имена файлов из списка аргументов, а не из стандартного ввода. Хотя STDIN часто связан с управляющим терминалом и унаследован от оболочки, которая читает stdin и устанавливает список аргументов для perl, это НЕ одно и то же.
Уильям Перселл
8

Другие упомянули perlrun. Если вы используете B :: Deparse, вы можете увидеть, что это означает (для большинства вещей):

$ perl -MO=Deparse   -p  -e 1
LINE: while (defined($_ = <ARGV>)) {
    '???';
}
continue {
    die "-p destination: $!\n" unless print $_;
}
-e syntax OK

1 обозначается символом «???», потому что он оптимизирован.

$ perl -MO=Deparse   -p -i  -e 1
BEGIN { $^I = ""; }
LINE: while (defined($_ = <ARGV>)) {
    '???';
}
continue {
    die "-p destination: $!\n" unless print $_;
}
-e syntax OK

-i устанавливает $ ^ I, например

$ perl -MO=Deparse   -p -i.bak  -e 1
BEGIN { $^I = ".bak"; }
LINE: while (defined($_ = <ARGV>)) {
    '???';
}
continue {
    die "-p destination: $!\n" unless print $_;
}
-e syntax OK

Но помните, что <ARGV> использует открытие с двумя аргументами, поэтому не используйте имена файлов, которые начинаются > <или начинаются / заканчиваются на |.

Liame
источник
4

Также есть один важный флаг, -nкоторый не упоминается в списке.

-nработает так же -p, только $_по умолчанию не печатает . Это может быть очень полезно при фильтрации текстовых файлов.

Таким образом, Perl может заменить grep | sedоднострочным.

Например:

perl -ne 'print "$1\n" if /Messages read: (\d+)/' <my_input.txt

Распечатает все целочисленные значения, найденные после «Сообщения прочитаны:», и не более того.

ржавый
источник
Это можно еще упростить. Нет необходимости в "print" $ 1 \ n "". Вместо этого вы можете просто использовать «печать».
пожрал элизиум
Нет, не может, print $1это не то же самое, что print( print $_).
rustyx
Он может: echo abc | perl -nw -e "print if (1)"распечатать abc. $1Ссылка не нужна .
пожрал элизиум
@devouredelysium: Да, но не хочет печатать всю строку, а только число, соответствующее регулярному выражению.
Инго Блехшмидт