Прапори Perl -pe, -pi, -p, -w, -d, -i, -t?


107

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

Нижче наведені прапори, з якими я найчастіше зустрічаюсь, і я не маю поняття, що вони означають:

  • Perl -pe
  • perl -pi
  • perl -p
  • perl -w
  • perl -d
  • перл
  • перл

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


21
Гуглінг за основними відповідями про perl часто приведе вас на деякі справді негідні сайти. завжди спочатку перевірте власну документацію Perl.
ysth


2
Відряджений. У цьому випадку perldoc perlrunє список усіх параметрів командного рядка, які Perl приймає.
Шерм Пендлі

1
Проблема Google: Знак мінус трактується Google як означає "виключити цей термін". Щоб уникнути такої поведінки, поставте в лапки термін, що містить знак мінус.
Роджер Крюгер

Відповіді:


147

Так, Google , як відомо , важко відриваючись розділові знаки і, на жаль, Perl дійсно , здається, в основному з пунктуації :-)

Перемикачі командного рядка детально описані перлрун . (доступно з командного рядка, зателефонувавши perldoc perlrun)

Коротко переглядаючи варіанти, один на один:

-p: Розміщує цикл друку навколо вашої команди, щоб він діяв на кожну
    рядок стандартного вводу. В основному використовується Perl, щоб перемогти
    штани off awk з точки зору потужності І простоти :-)
-n: Розміщує цикл, що не друкується, навколо вашої команди.
-e: Дозволяє надати програму як аргумент
    ніж у файлі. Вам не потрібно створювати сценарій
    файл для кожного маленького однолінійного Perl.
-i: Змінює вхідний файл на місці (робить резервну копію
    оригінал). Зручно змінювати файли без {копії,
    delete-original, перейменувати} процес.
-w: Активує деякі попередження. Будь-який хороший кодер Perl використовуватиме це.
-d: працює під налагоджувачем Perl. Щоб налагодити код Perl,
    очевидно.
-t: певний "заплямований" (сумнівний) код трактує як попередження (власне)
    Режим taint буде помилковим у цьому сумнівному коді). Використовується для яловичини
    підвищити безпеку Perl, особливо при запуску коду для інших
    користувачі, такі як встановлені сценарії чи веб-матеріали.

1
Я не помітив, що ви посилалися perldoc perlrun. Я видалив свою відповідь. :-)
Алан Хаггай Алаві

4
-wяк правило, цього слід уникати, оскільки він дозволяє попереджати всі коди, включаючи модулі CPAN, які не були написані з попередженнями. Результати, як правило, досить галасливі, а також досить марні.
duskwuff -inactive-

9
-wзазвичай уникають, але його слід замінити use warningsу власному коді.
плюсplus

6
@duskwuff: Загалом я погоджуюсь, і я дію use warningsу власному коді, але -w має користь - це допомагає вилучити погано написані модулі CPAN. :-)
Шерм Пендлі

2
@IanBytchek Аргументи, які можуть / повинні приймати додатковий параметр, не можуть знаходитися в стисненому списку. -iбере розширення для резервної копії. -eприймає команду perl. У -0ep вас ви говорите perl, що 'p' - це команда perl замість аргументу. Це зовсім не вийде.
tjd

10

-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


2
-wне зовсім те саме use warnings, що останній
підпадає

плюс, плюс, правдива, виправна відповідь.
зелліо

2
Передача скрипту як аргументу - це не те саме, що передача його на STDIN. -i приймає імена файлів зі списку аргументів, а не stdin. Хоча STDIN часто асоціюється з керуючим терміналом і успадковується від оболонки, яка читає stdin та встановлює список аргументів для perl, вони НЕ є тим самим.
Вільям Перселл

8

Інші згадали перлрун. Якщо ви використовуєте 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 встановлює $ ^ я, як

$ 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-аргумент, тому не майте назви файлів, які починаються з > <або починаються / закінчуються |.


4

Також є один важливий прапор, -nякий не зазначений у списку.

-nпрацює так само -p, як лише друк $_за замовчуванням. Це може бути дуже корисно при фільтрації текстових файлів.

Таким чином Perl може замінюватися grep | sedв одному одноколірному.

Наприклад:

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

Виведе кожне ціле значення, знайдене після "Читання повідомлень:", і більше нічого.


Це можна додатково спростити. Не потрібно "друкувати" $ 1 \ n "". Ви можете просто використовувати "друк" замість цього.
пожирав елізіум

Ні, не може, print $1не те саме, що print( print $_).
іржа

Це може: echo abc | perl -nw -e "print if (1)"буде надрукувати abc. Немає необхідності в $1довідці.
пожирав елізіум

@devouredelysium: Так, але не хочеться надрукувати весь рядок, а лише число, відповідне регулярним виразом.
Інго Блешшмідт
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.