我可以用 return 替换没有 $+ 的括号的匹配部分吗?

Can I substitute and return the matched portion of parentheses without $+?

下面的代码 基本上 实现了我想要实现的目标:它替换了变量的一部分并将替换值的一部分分配给 $foo

my $value = "The foo is 42, but the bar is 12!";

my $foo = $+ if $value =~ s/foo is (\d+)//;

print "foo: $foo\n" if $foo;
print $value, "\n";

我的问题是 "the right way" 是否可以这样做。特别是,我对 $foo = $+ if ... s/.../.../ 构造不太满意,想知道是否有(我觉得)更优雅的方法来做到这一点。

很难知道你在说什么,但这里有一些原因 那样写。

你应该永远不要写类似

的东西
my $foo = $+ if $value =~ s/foo is (\d+)//

因为官方未定义结果。 perldoc perlsyn有话要说

NOTE: The behaviour of a my, state, or our modified with a statement modifier conditional or loop construct (for example, my $x if ...) is undefined. The value of the my variable may be undef, any previously assigned value, or possibly anything else. Don't rely on it.

此外,最好使用捕获变量</code>,因为它更明确,而且很多人可能不知道<code>$+ 的作用。而且比如果定义了$foo

更能说明测试替换是否成功

我会写这样的东西

my $value = "The foo is 42, but the bar is 12!";

if ( $value =~ s/foo is (\d+)// ) {
  my $foo = ;
  print "foo: $foo\n";
}

print $value, "\n";

如果将带有子表达式的匹配表达式分配给列表,则匹配项将分配给列表元素:

my $value = "The foo is 42, but the bar is 12!";

my ($foo) = $value =~ /foo is (\d+)/;
$value = $`.$';

print "foo: $foo\n" if $foo;
print "$value\n";

但显然这不适用于替换,因此您需要单独替换。我不知道如何一次赋值和替换。