Соответствуйте регулярному выражению и присвойте результаты в одной строке кода - PullRequest
37 голосов
/ 06 сентября 2010

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

Я хочу по существу объединить строки 2 и 3 в одну строку кода:

$variable = "some string";
$variable =~ /(find something).*/;
$variable = $1;

Существует ли более короткий / простой способ сделать это?Я что-то упустил?

Ответы [ 9 ]

55 голосов
/ 06 сентября 2010
my($variable) = "some string" =~ /(e\s*str)/;

Это работает, потому что

Если опция /g не используется, m// в контексте списка возвращает список, состоящий из подвыражений, совпадающих с круглыми скобками в шаблоне, т.е. , ($1, $2 , $3…).

и потому что my($variable) = ... (обратите внимание на круглые скобки вокруг скаляра) предоставляет контекст списка для сопоставления.

Если шаблон не соответствует, $variable получает неопределенное значение.

25 голосов
/ 06 сентября 2010

Почему вы хотите, чтобы оно было короче? Это действительно важно?

$variable = $1 if $variable =~ /(find something).*/;

Если вас беспокоит имя переменной или вы делаете это неоднократно, оберните вещь в подпрограмму и забудьте об этом:

 some_sub( $variable, qr/pattern/ );
 sub some_sub { $_[0] = $1 if eval { $_[0] =~ m/$_[1]/ }; $1 };

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

7 голосов
/ 06 сентября 2010

Вы можете сделать замену как:

$a = 'stackoverflow';
$a =~ s/(\w+)overflow/$1/;

$a сейчас "stack"

6 голосов
/ 06 сентября 2010

Ну, вы могли бы сказать

my $variable;
($variable) = ($variable = "find something soon") =~ /(find something).*/;

или

(my $variable = "find something soon") =~ s/^.*?(find something).*/$1/;
4 голосов
/ 26 марта 2013
$variable2 = "stackoverflow";
(my $variable1) = ($variable2 =~ /stack(\w+)/);

$variable1 теперь равно "overflow".

4 голосов
/ 06 сентября 2010

Почти ....

Вы можете объединить совпадение и получить сопоставленное значение с подстановкой.

$variable =~ s/.*(find something).*/$1/;

AFAIK, Вам всегда придется копировать значение, если только вы не хотите засорять оригинал.

3 голосов
/ 11 мая 2018

Из Perl Cookbook 2nd ed 6.1 Одновременное копирование и подстановка

$dst = $src;
$dst =~ s/this/that/;

становится

($dst = $src) =~ s/this/that/;

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

3 голосов
/ 06 сентября 2010

Я делаю это:

#!/usr/bin/perl

$target = "n: 123";
my ($target) = $target =~ /n:\s*(\d+)/g;
print $target; # the var $target now is "123"
0 голосов
/ 08 февраля 2019

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

my $match = $variable =~ /(*pattern*).*/ ? $1 : *defaultValue*;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...