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

82

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

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

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

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

  • 19
    поиск основных ответов о Perl часто приводит вас к некоторым действительно бесполезным сайтам. всегда сначала проверяйте собственную документацию Perl.
Показать ещё 2 комментария
Теги:
command-line
flags

5 ответов

114
Лучший ответ

Да, 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.
  • 0
    Я не заметил, что вы ссылались на perldoc perlrun . Я удалил свой ответ. :-)
  • 0
    Спасибо за ваш откровенный ответ
Показать ещё 5 комментариев
9

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

  • 2
    -w не совсем то же самое, что use warnings , последнее распространяется на локальный файл
  • 0
    plusplus, правда, я исправляю ответ.
Показать ещё 1 комментарий
6

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

3

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

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

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

Например:

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

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

  • 0
    Это может быть дополнительно упрощено. Нет необходимости в "print" $ 1 \ n "". Вы можете просто использовать «печать» вместо.
  • 0
    Нет, это невозможно, print $1 - это не то же самое, что print ( print $_ ).
Показать ещё 2 комментария
0

В качестве побочного элемента: очень хорошая книга о 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/)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню