Флаги-ПЭ Перл-Пи-п-з-д-и-Т?
Я видел много способов запуска кода Perl или скриптов с разными флагами. Однако, когда я пытаюсь google для того, что означает каждый флаг, я в основном получаю результаты на общие сайты Perl, и никакой конкретной информации о флагах или их использовании там не найдено.
Ниже приведены флаги, с которыми я сталкиваюсь чаще всего, и я понятия не имею, что они означают:
- perl - pe
- perl Пи
- perl - p
- perl - w
- perl - d
- perl -Я
- perl - t
Я буду очень благодарен, если вы скажете мне, что каждый из них означает и некоторые случаи использования для них, или, по крайней мере, скажите мне способ выяснить их значение.
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.
The
-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
другие упоминали 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, like
$ 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
но помните, что
использует 2-аргумент open, поэтому у вас нет имен файлов, которые начинаются с > <
или начало/конец с|
.
есть еще один важный флаг
-n
, который не упоминается в списке.
-n
работает так же, как-p
, только он не печатает$_
по умолчанию. Это может быть очень полезно при фильтрации текстовых файлов.таким образом Perl может заменить
grep | sed
один в один-лайнер.например:
perl -ne 'print "\n" if /Messages read: (\d+)/' <my_input.txt
выведет все целочисленные значения, найденные после " сообщения read:", и ничего больше.