Флаги-ПЭ Перл-Пи-п-з-д-и-Т?


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

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

  • perl - pe
  • perl Пи
  • perl - p
  • perl - w
  • perl - d
  • perl
  • perl - t

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

4 89

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:", и ничего больше.