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

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

Ответ 1

Да, 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.

Ответ 2

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

Ответ 3

Другие упомянули 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 > .

Ответ 4

Существует также один важный флаг -n, который не указан в списке.

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

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

Например:

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

Выведет любое целочисленное значение, найденное после "Чтение сообщений:", и ничего более.