我可以在没有$ +的情况下替换并返回括号的匹配部分吗?

时间:2015-02-19 13:04:01

标签: perl substitution

以下代码 基本上是我想要实现的:它替换变量的一部分并将替换值的一部分分配给$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";

我的问题是,这是"正确的方式"要做到这一点。特别是,我对$foo = $+ if ... s/.../.../构造并不是很满意,并且想知道是否有(我的感觉)更优雅的方式来做这件事。

2 个答案:

答案 0 :(得分:5)

很难知道你会得到什么样的东西,但这就是为什么以这种方式写它的原因。

你应该从不写一些像

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

因为结果是正式未定义的。 perldoc perlsyn有这个说法

  

注意:使用语句修饰符条件或循环结构修改的mystateour的行为(例如,{{1 })未定义。 my $x if ...变量的值可以是my,任何先前分配的值,或者可能是其他任何值。不要依赖它。

此外,最好使用捕获变量undef,因为它更明确,并且因为很多人可能不知道$1做了什么。并且测试替换是否成功比定义$+更具描述性。

我会写这样的东西

$foo

答案 1 :(得分:-1)

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

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";

但显然这对替换不起作用,所以你需要单独替换。我不知道如何分配和替换。