Соответствовать регулярному выражению и назначить результаты в одной строке кода
Я хочу иметь возможность выполнять регулярное выражение для переменной и присваивать результаты самой переменной. Каков наилучший способ сделать это?
Я хочу по существу объединить строки 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"