替换<与<到处都是内部反叛

时间:2015-04-04 13:31:16

标签: perl

我有一个包含代码的多行$string。我希望将所有<>字符替换为&lt;&gt;,但是在反引号中。

示例:

Here a < and a ` some foo < stuff`

输出:

Here a &lt; and a ` some foo < stuff`

在Perl中实现它的最简单方法是什么?

1 个答案:

答案 0 :(得分:2)

您没有很好地定义您的问题,但这会替换所有<符号,这些符号既不会立即出现,也不会立即反复出现。

use strict;
use warnings;

while ( <DATA> ) {
  s/(?<!`)<(?!`)/&lt;/g;
  print;
}

__DATA__
Here a < and a `<` and Here a < and a `<`
Here a < and a `<`

<强>输出

Here a &lt; and a `<` and Here a &lt; and a `<`
Here a &lt; and a `<`

<强>更新

好的,所以你可以在反引号中包含任何数据,包括换行符(我认为,但你似乎不愿意这样说),如果你把整个文件读成一个标量变量,这个数据会更容易处理。

这可以通过找到所有反引号封闭的子串或小于<的符号来实现,并将前者替换为自身,将后者替换为&lt;

use strict;
use warnings;

my $data = do {
  local $/;
  <DATA>;
};

$data =~ s{ ( `[^`]*` ) | < }{ $1 // '&lt;' }egx;
print $data;

__DATA__
Here a < and a ` some foo < stuff`
Here a < and a ` some foo <
stuff`
Here a < and a ` some foo < stuff`

<强>输出

Here a &lt; and a ` some foo < stuff`
Here a &lt; and a ` some foo <
stuff`
Here a &lt; and a ` some foo < stuff`