Соответствовать регулярному выражению и назначить результаты в одной строке кода

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

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

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

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

Ответ 1

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

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

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

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

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

Ответ 2

my($variable) = "some string" =~ /(e\s*str)/;

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

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

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

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

Ответ 3

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

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

$a теперь "stack"

Ответ 4

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

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

или

(my $variable = "find something soon") =~ s/^.*?(find something).*/$1/;

Ответ 5

Почти...

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

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

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

Ответ 6

$variable2 = "stackoverflow";
(my $variable1) = ($variable2 =~ /stack(\w+)/);

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

Ответ 7

Я делаю это:

#!/usr/bin/perl

$target = "n: 123";
my ($target) = $target =~ /n:\s*(\d+)/g;
print $target; # the var $target now is "123"