我有一个包含代码的多行$string
。我希望将所有<
和>
字符替换为<
和>
,但是在反引号中。
示例:
Here a < and a ` some foo < stuff`
输出:
Here a < and a ` some foo < stuff`
在Perl中实现它的最简单方法是什么?
答案 0 :(得分:2)
您没有很好地定义您的问题,但这会替换所有<
符号,这些符号既不会立即出现,也不会立即反复出现。
use strict;
use warnings;
while ( <DATA> ) {
s/(?<!`)<(?!`)/</g;
print;
}
__DATA__
Here a < and a `<` and Here a < and a `<`
Here a < and a `<`
<强>输出强>
Here a < and a `<` and Here a < and a `<`
Here a < and a `<`
<强>更新强>
好的,所以你可以在反引号中包含任何数据,包括换行符(我认为,但你似乎不愿意这样说),如果你把整个文件读成一个标量变量,这个数据会更容易处理。
这可以通过找到所有反引号封闭的子串或小于<
的符号来实现,并将前者替换为自身,将后者替换为<
。
use strict;
use warnings;
my $data = do {
local $/;
<DATA>;
};
$data =~ s{ ( `[^`]*` ) | < }{ $1 // '<' }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 < and a ` some foo < stuff`
Here a < and a ` some foo <
stuff`
Here a < and a ` some foo < stuff`