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

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

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

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

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


person Tudor Constantin    schedule 10.06.2011    source источник
comment
Поиск в Google простых ответов о perl часто приводит вас к действительно бесполезным сайтам. всегда сначала проверяйте собственную документацию perl.   -  person ysth    schedule 10.06.2011
comment
Прикомандированный. В этом случае perldoc perlrun содержит список всех параметров командной строки, которые принимает Perl.   -  person Sherm Pendley    schedule 13.06.2011
comment
Проблема Google: знак минус интерпретируется Google как означающий исключить этот термин. Чтобы избежать такого поведения, заключите термин, содержащий знак минус, в кавычки.   -  person Roger Krueger    schedule 12.12.2017


Ответы (4)


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

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

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

-p: Places a printing loop around your command so that it acts on each
    line of standard input. Used mostly so Perl can beat the
    pants off awk in terms of power AND simplicity :-)
-n: Places a non-printing loop around your command.
-e: Allows you to provide the program as an argument rather
    than in a file. You don't want to have to create a script
    file for every little Perl one-liner.
-i: Modifies your input file in-place (making a backup of the
    original). Handy to modify files without the {copy,
    delete-original, rename} process.
-w: Activates some warnings. Any good Perl coder will use this.
-d: Runs under the Perl debugger. For debugging your Perl code,
    obviously.
-t: Treats certain "tainted" (dubious) code as warnings (proper
    taint mode will error on this dubious code). Used to beef
    up Perl security, especially when running code for other
    users, such as setuid scripts or web stuff.
person paxdiablo    schedule 10.06.2011
comment
Я не заметил, что вы упомянули perldoc perlrun. Я удалил свой ответ. :-) - person Alan Haggai Alavi; 10.06.2011
comment
Спасибо за ваш поучительный ответ - person Tudor Constantin; 10.06.2011
comment
На самом деле -w обычно следует избегать, поскольку он позволяет выводить предупреждения для всего кода, включая модули CPAN, которые были написаны без предупреждений. Результаты в целом довольно шумные, а также довольно бесполезные. - person ; 10.06.2011
comment
-w обычно избегают, но его следует заменить на use warnings в вашем собственном коде. - person plusplus; 10.06.2011
comment
@duskwuff: В целом я согласен, и я использую use warnings в своем собственном коде, но -w действительно используется - он помогает отсеять плохо написанные модули CPAN. :-) - person Sherm Pendley; 13.06.2011
comment
Можете рассказать о порядке расположения флагов? Если я делаю perl -i -0pe, все работает, как ожидалось, если я perl -i -0ep - нет, если я изменяю порядок других флагов, он также ломается. Что с этим делать? Я очень запуталась ... - person Ian Bytchek; 26.11.2014
comment
@IanBytchek Аргументы, которые могут / должны принимать дополнительный параметр, не могут находиться внутри сжатого списка. -i принимает расширение для резервной копии. -e принимает команду perl. В -0ep вы говорите perl, что 'p' - это команда perl, а не аргумент. Это вообще не сработает. - person tjd; 23.05.2016

Флаг -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

person zellio    schedule 10.06.2011
comment
-w не совсем то же самое, что use warnings, последний привязан к локальному файлу - person plusplus; 10.06.2011
comment
plusplus, правда, патченный ответ. - person zellio; 10.06.2011
comment
Передача скрипта в качестве аргумента - это не то же самое, что передача его в STDIN. -i берет имена файлов из списка аргументов, а не из стандартного ввода. Хотя STDIN часто ассоциируется с управляющим терминалом и наследуется от оболочки, которая читает stdin и устанавливает список аргументов для perl, это НЕ одно и то же. - person William Pursell; 10.06.2011

Другие упомянули 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› использует открытие с двумя аргументами, поэтому не используйте имена файлов, начинающиеся с > < или начинающиеся / заканчивающиеся на |.

person liame    schedule 13.06.2011

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

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

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

Например:

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

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

person rustyx    schedule 23.05.2016
comment
Это можно еще упростить. Печать $ 1 \ n не требуется. Вместо этого вы можете просто использовать печать. - person devoured elysium; 09.05.2017
comment
Нет, не может, print $1 не то же самое, что print (print $_). - person rustyx; 09.05.2017
comment
Он может: echo abc | perl -nw -e "print if (1)" напечатать abc. Ссылка $1 не требуется. - person devoured elysium; 10.05.2017
comment
@devouredelysium: Да, но не хочет печатать всю строку, а только число, соответствующее регулярному выражению. - person Ingo Blechschmidt; 11.02.2018