以下代码 基本上是我想要实现的:它替换变量的一部分并将替换值的一部分分配给$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/.../.../
构造并不是很满意,并且想知道是否有(我的感觉)更优雅的方式来做这件事。
答案 0 :(得分:5)
很难知道你会得到什么样的东西,但这就是为什么不以这种方式写它的原因。
你应该从不写一些像
这样的东西my $foo = $+ if $value =~ s/foo is (\d+)//
因为结果是正式未定义的。 perldoc perlsyn
有这个说法
注意:使用语句修饰符条件或循环结构修改的
my
,state
或our
的行为(例如,{{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";
但显然这对替换不起作用,所以你需要单独替换。我不知道如何分配和替换。