Флаги Perl -pe, -pi, -p, -w, -d, -i, -t? - PullRequest
98 голосов
/ 10 июня 2011

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

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

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

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

Ответы [ 4 ]

137 голосов
/ 10 июня 2011

Да, 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.
10 голосов
/ 10 июня 2011

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

8 голосов
/ 13 июня 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

Но помните, использует открытие с двумя аргументами, поэтому не используйте имена файлов, начинающиеся с > < или начало / конец с |.

4 голосов
/ 23 мая 2016

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

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

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

Например:

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

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

...