Как мне присвоить результат соответствия регулярному выражению новой переменной в одной строке? - PullRequest
10 голосов
/ 08 июня 2011

Я хочу сопоставить и присвоить переменной только одну строку:

my $abspath='/var/ftp/path/to/file.txt';

$abspath =~ #/var/ftp/(.*)$#;
my $relpath=$1;

Я уверен, что это должно быть легко.

Ответы [ 5 ]

18 голосов
/ 08 июня 2011
my ($relpath) = $abspath =~ m#/var/ftp/(.*)$#;

В контексте списка совпадение возвращает значения групп.

15 голосов
/ 08 июня 2011

Обязательная Clippy: "Привет! Я вижу, что вы делаете манипулирование путями в Perl. Хотите использовать Path :: Class вместо этого?"

use Path::Class qw(file);
my $abspath = file '/var/ftp/path/to/file.txt';
my $relpath = $abspath->relative('/var/ftp');
# returns "path/to/file.txt" in string context
9 голосов
/ 08 июня 2011

Вы можете сделать это с помощью оператора сравнения и замены:

(my $relpath = $abspath ) =~ s#/var/ftp/(.*)#$1# ;

Этот код присваивает $abspath значению $relpath, а затем применяет к нему регулярное выражение.

Редактировать: Ответ Qtax более элегантен, если вам просто нужны простые совпадения. Если вам когда-нибудь понадобятся сложные подстановки (как мне обычно нужно), просто используйте мое выражение.

5 голосов
/ 08 июня 2011

В Perl 5.14 вы также можете использовать модификатор /r (неразрушающее замещение):

perl -E'my $abspath="/var/ftp/path/to/file.txt"; \
        my $relpath= $abspath=~ s{/var/ftp/}{}r; \
        say "abspath: $abspath - relpath: $relpath"'

См. " Новые возможности Perl 5.14: неразрушающее замещение " длябольше примеров.

0 голосов
/ 09 июня 2011

Поскольку вы просто хотите удалить начало строки, вы можете оптимизировать выражение:

(my $relpath = $abspath) =~ s#^/var/ftp/##;

Или даже:

my $relpath = substr($abspath, 9);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...