Возврат только совпадений из подстановки в Perl 5.8.8 (был: Perl "p" эквивалент модификатора регулярного выражения) - PullRequest
4 голосов
/ 14 декабря 2010

У меня есть скрипт ( source ) для разбора svn info для создания подходящей строки для Bash's $PS1.К сожалению, это не работает на одной системе, которую я использую, на которой запущен Perl 5.8.8 - он выводит все строки, а не только совпадения.Какой Perl 5.8.8 будет эквивалентен следующему?

__svn_ps1()
{
    local result=$(
        svn info 2>/dev/null | \
        perl -pe 's;^URL: .*?/((trunk)|(branches|tags)/([^/]*)).*;\2\4 ;p')
    if [ -n "$result" ]
    then
        printf "${1:- (%s)}" $result
    fi  
}

Вывод Perl 5.10 содержит только пробел, круглую скобку, одно из имени ветви, имени тега или trunk и конечную скобку,Выходные данные Perl 5.8.8 (без окончательного p) содержат эту плюс версию в скобках каждой разделенной пробелами части вывода svn info.

Возможный обходпростой grep '^URL: ' между командами svn и perl, но я надеялся избежать этого, так как это будет выполняться для каждого приглашения Bash.

Ответы [ 2 ]

11 голосов
/ 14 декабря 2010

Если вы хотите выводить только из совпадающей строки, не используйте ключ командной строки -p.Он печатает значение $_ в конце каждого цикла.Возможно, вы захотите что-то с ключом командной строки -n:

 perl -ne 'print if s/.../.../'

Я бы сделал то же самое для Perl v5.8 и v5.10.Я не уверен, что, по вашему мнению, делает модификатор /p, поскольку вы не используете переменные $`, $& или $' или их эквиваленты для сопоставления.читать о ключах командной строки в perlrun .

6 голосов
/ 14 декабря 2010

Начиная с perl 5.10, переключатель /p предписывает perl помещать совпадающее содержимое в ${^PREMATCH}, ${^MATCH} и ${^POSTMATCH}.

.vars, поэтому опустите /p.

ОБНОВЛЕНИЕ: Попытка не отставать от первоначального вопроса ...

perl -ne 's/search/replace/ and print'

Печатает только те строки, для которых была произведена замена.Примечание -n против -p переключатель.Кроме того, я попробовал комбо -p /p на своем 5.10, и он также успешно печатает неизмененные несоответствующие строки.Может быть, я что-то пропустил ...

...