Что значит |. * / ||делать в Perl регулярное замещение? - PullRequest
0 голосов
/ 11 октября 2018

Я работаю над преобразованием скрипта Perl cgi в Python.

Внутри скрипта я наткнулся на приведенный ниже код, который я не понял.

Помогите мне разобраться в этомout.

my $p = $0;
$p =~ s|.*/||;

Я понял, что my $p = $0; назначает абсолютный путь + имя файла скрипта переменной p .

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

Но я не понял, что это |.*/|| после s.

Я искал много ресурсов, но не понял, что он делает.

Что на самом деле собираются сделать, чтобы дать мне только имя сценария?

Ответы [ 2 ]

0 голосов
/ 11 октября 2018

Оператор подстановки Perl выглядит следующим образом:

s/PATTERN/STRING/

Но это также один из тех операторов Perl, которые позволяют вам выбирать свои собственные разделители.Итак, еще один способ написать это:

s|PATTERN|STRING|

И это версия, которую вы видите здесь.Ваш шаблон .*/, а строка замены пуста.Таким образом, ваша подстановка означает «найти как можно больше (не начинающихся) символов, за которыми следует косая черта, и заменить их ничем».Глядя на это вместе с присваиванием в строке над ним (в котором используется $0 - путь к программе), похоже, что у нас есть код, который удаляет каталоги с начала пути и просто оставляет имя файла.

То есть, если вы начнете с имени программы /usr/local/bin/my_program, то $p в итоге будет содержать только my_program.

Лучший способ написать это в Perl - использовать File :: Basename модуль.Я был бы удивлен, если бы у Python не было чего-то подобного.

use File::Basename;

my $p = basename($0);
0 голосов
/ 11 октября 2018

Учитывая, что специальная переменная $0 не содержит перевода строки - регулярное выражение s|.*/|| фактически удаляет .* (все) перед последним (и последним) / из вашей строки.Таким образом, вы можете сократить путь и сохранить только имя файла (все после последнего /).

Существуют различные разделители для подстановки.Это может быть s/// или что-то еще.В любом случае вам нужно прочитать о замене perl .

FYI.Также имейте в виду, что .*? означает не жадное регулярное выражение .Так что это будет соответствовать чему-либо до первого /.

...