我可以用 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";
但显然这不适用于替换,因此您需要单独替换。我不知道如何一次赋值和替换。
下面的代码 基本上 实现了我想要实现的目标:它替换了变量的一部分并将替换值的一部分分配给 $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
, orour
modified with a statement modifier conditional or loop construct (for example,my $x if ...
) is undefined. The value of themy
variable may beundef
, 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";
但显然这不适用于替换,因此您需要单独替换。我不知道如何一次赋值和替换。