Встроенная замена regex в perl
есть ли способ заменить текст на встроенное регулярное выражение, а не брать текст из переменной и хранить его в переменной?
Я новичок perl. Я часто сам пишу
my $foo = $bar;
$foo =~ s/regex/replacement/;
doStuff($foo)
где я действительно хотел бы написать
doStuff($bar->replace(s/regex/replacement/));
или тому подобное, вместо использования временной переменной и трех строк.
есть ли способ сделать это? Очевидно, когда регулярное выражение достаточно сложно, имеет смысл разделить его, чтобы он мог лучше объяснить, но когда это просто s/s//g
кажется неправильным загромождать код дополнительными переменными.
6 ответов
начиная с Perl 5.14, вы можете использовать неразрушающей замены для достижения желаемого поведения.
использовать /r
модификатор для этого:
doStuff($bar=~s/regex/replacement/r);
вы действительно не можете делать то, что хотите, потому что функция подстановки возвращает либо 1
если это сработало или пустая строка, если это не сработало. Это означает, что если вы сделали это:
doStuff($foo =~ s/regex/replacement/);
на
можно использовать do { }
блок, чтобы избежать создания временной переменной в текущей области:
doStuff( do {(my $foo = $bar) =~ s/regex/replacement/; $foo} );
это то, что вы хотите?:
my $foo = 'Replace this with that';
(my $bar = $foo) =~ s/this/that/;
print "Foo: $foo\nBar: $bar\n";
принты:
Foo: Replace this with that
Bar: Replace that with that
есть еще один способ: напишите свою собственную функцию:
sub replace (
my $variable = shift;
my $substring = shift;
eval "$variable =~ s${substring};";
return $variable
}
doStuff(replace($foo, "/regex/replace/"));
Это не стоило бы для одного вызова, и это, вероятно, просто сделает ваш код более запутанным в этом случае. Однако, если вы делаете это дюжину или около того раз, может иметь смысл написать свою собственную функцию для этого.