2010-02-25 78 views
-4

在应用s///运算符后,有什么方法可以找出替代(“旧”文本)的内容吗?我试过了:如何找出在Perl替换中被替换的内容?

if (s/(\w+)/new/) { 
    my $oldTxt = $1; 
    # ... 
} 

但这并不奏效。 $1未定义。

+1

像往常一样,向我们展示与说明问题违规输入一个完整的,最小的方案。错误可能在其他地方。 – 2010-02-25 23:29:19

+0

它必须在别的地方,因为他发布的代码工作得很好。 – cjm 2010-02-26 02:19:42

回答

-1

您应该能够使用Perl匹配变量:

$&包含由过去的模式匹配匹配的字符串

0

你可以做更换一个eval表达:

if (s/(\w+)/$var=$1; "new"/e) { .. do something with $var .. } 
+0

虽然这可行,但不需要它。他发布的代码是正确的。 – cjm 2010-02-26 03:41:27

7

您的代码适用于我。从一个真正的终端窗口复制并粘贴:

$ perl -le '$_ = "*X*"; if (s/(\w+)/new/) { print $1 }' 
X 

您的问题必须是别的。

+2

也许他的表情不匹配,则不会发生替换,并且$ 1未设置。 – kriss 2010-02-25 23:29:25

+2

如果它不匹配,那么它甚至不会进入“if”的主体 – JoelFan 2010-02-26 00:19:23

+1

@JoelFan:我的猜测是您简化了代码以便在此处发布它,并且这样做可以删除任何错误。 – cjm 2010-02-26 02:53:54

1

$&你想要做什么,但看到健康警示在perlvar

在程序中任何地方使用这个变量的规定相当大的性能损失,在所有正则表达式匹配。

如果你可以找到一种方法来做到这一点,而不使用$&,尝试。如果您使用5.10或更高版本,您不必使用潜在的,性能比较查杀$&

my ($match) = /(\w+)/; 
if (s/(\w+)/new/) { 
    my $oldTxt = $match; 
    # ... 
} 
6

:你可以运行两次正则表达式。从/p标志的${^MATCH}变量做同样的事,但只与指定的正则表达式:

use 5.010; 

if(s/abc(\w+)123/new/p) { 
     say "I replaced ${^MATCH}" 
     }