麻烦逃脱美元符号在Perl

时间:2012-11-07 22:10:12

标签: regex perl escaping

我从外部源获取一堆文本,将其保存在变量中,然后将该变量显示为更大的HTML块的一部分。我需要按原样显示它,美元符号给我带来麻烦。

以下是设置:

# get the incoming text
my $inputText = "This is a $-, as in $100. It is not a 0.";

print <<"OUTPUT";
before-regex: $inputText
OUTPUT

# this regex seems to have no effect
$inputText =~ s/\$/\$/g;

print <<"OUTPUT";
after-regex:  $inputText
OUTPUT

在现实生活中,那些print块是更大的HTML块,直接插入变量。

我尝试使用s/\$/\$/g转义美元符号,因为我的理解是第一个\$转义正则表达式,因此搜索$,第二个\$是什么插入并稍后转义Perl,以便它只显示$。但我无法让它发挥作用。

这是我得到的:

before-regex: This is a 0, as in . It is not a 0.
after-regex:  This is a 0, as in . It is not a 0.

这就是我想要看到的:

before-regex: This is a 0, as in . It is not a 0.
after-regex:  This is a $-, as in $100. It is not a 0.

谷歌搜索带我到this question。当我在答案中尝试使用数组和for循环时,它没有任何效果。

如何让块输出完全按原样显示变量?

3 个答案:

答案 0 :(得分:7)

使用双引号构造字符串时,会立即执行变量替换。在这种情况下,您的字符串永远不会包含$字符。如果您希望$出现在字符串中,请使用单引号或转义它,并注意如果您这样做,您将不会获得任何变量替换。

至于你的正则表达式,这很奇怪。它正在寻找$并将其替换为$。如果你想要反斜杠,你也必须逃避它们。

答案 1 :(得分:4)

  

这就是我想要看到的:

before-regex: This is a 0, as in . It is not a 0.
after-regex:  This is a $-, as in $100. It is not a 0.
哼,好吧,我不确定一般情况是什么,但也许会有以下情况:

s/0/\$-/;
s/in \K/\$100/;

或者你的意思是从

开始
 my $inputText = "This is a \$-, as in \$100. It is not a 0.";
 # Produces the string: This is a $-, as in $100. It is not a 0.

 my $inputText = 'This is a $-, as in $100. It is not a 0.';
 # Produces the string: This is a $-, as in $100. It is not a 0.

答案 2 :(得分:2)

您的错误是在变量声明中使用双引号而不是单引号。

这应该是:

# get the incoming text
my $inputText = 'This is a $-, as in $100. It is not a 0.';

了解'和'与`之间的区别。请参阅http://mywiki.wooledge.org/Quoteshttp://wiki.bash-hackers.org/syntax/words

这适用于shell,但它在Perl中是相同的。