Я видел много способов запуска Perl-кода или скриптов с разными флагами. Однако, когда я пытаюсь использовать Google для каждого флага, я в основном получаю результаты для общих сайтов Perl, и никакой конкретной информации о флагах или их использовании не найдено.
Ниже приведены флаги, которые я встречаю чаще всего, и я не знаю, что они означают:
Буду очень признателен, если вы скажете мне, что каждое из них означает и некоторые варианты использования для них, или, по крайней мере, сказать мне способ узнать их смысл.
Да, 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.
perldoc perlrun
. Я удалил свой ответ. :-)
Флаг -p
в основном запускает script с
while (<>) {
# exec here
}
continue {
print or die "-p destination: $!\n";
}
-e
позволяет передать script в STDIN
perl -e '$x = "Hello world!\n"; print $x;'
-i
направляет интерпретатору, что все данные, переданные STDIN
исполняемым script, должны выполняться на месте.
-w
совпадает с use warnings;
, но в глобальной, а не локальной области
-d
запускает отладчик Perl
-w
не совсем то же самое, что use warnings
, последнее распространяется на локальный файл
Другие упомянули 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> использует открытый аргумент 2 аргумента, поэтому имена файлов, начинающиеся с > <
, не начинаются с/t24 > .
Существует также один важный флаг -n
, который не указан в списке.
-n
работает так же, как -p
, только он не печатает $_
по умолчанию. Это может быть очень полезно при фильтрации текстовых файлов.
Таким образом Perl может заменить grep | sed
на один однострочный.
Например:
perl -ne 'print "$1\n" if /Messages read: (\d+)/' <my_input.txt
Выведет любое целочисленное значение, найденное после "Чтение сообщений:", и ничего более.
print $1
- это не то же самое, что print
( print $_
).
В качестве побочного элемента: очень хорошая книга о perl one-liners: http://www.catonmat.net/blog/perl-one-liners-no-starch-press/
Для общего вкуса см. записи в блоге автора. Это о -pie и т.д.: http://www.catonmat.net/blog/introduction-to-perl-one-liners/ (и для некоторого удовольствия см. http://www.catonmat.net/blog/secret-perl-operators/)