Встроенная замена 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/);

на


use Algorithm::Loops "Filter";

# leaves $foo unchanged
doStuff( Filter { s/this/that/ } $foo );

можно использовать 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/"));

Это не стоило бы для одного вызова, и это, вероятно, просто сделает ваш код более запутанным в этом случае. Однако, если вы делаете это дюжину или около того раз, может иметь смысл написать свою собственную функцию для этого.