Perl替代REPLACE字段中的“ <”

时间:2018-08-31 22:41:13

标签: perl substitution

为什么要应用perl代码

 undef $/;  # read in entire file or STDIN
 $_ = <>;
 s|<head>.*<\head>|<head>...</head>|s;

应用于包含以下内容的文本文件

 <head>[anything]</head>

生产

 ...

而不是

 <head>...</head>

当替换REPLACE字段中的'<'字符被省略时,如

 s|<head>.*</head>|head>.../head>|s;

替代产生

 head>...end>

'<'字符会有所不同,但我找不到原因的解释。

如何在替换结果中产生'<'?

2 个答案:

答案 0 :(得分:1)

第一个代码段不会产生您要求的输出。

$ perl -e'$_ = "<head>foo</head>"; s|<head>.*<\head>|<head>...</head>|s; CORE::say'
<head>foo</head>

之所以不执行替换,是因为\h与水平空白字符匹配。

您可能打算使用</head>而不是<\head>。产生所需的输出。

$ perl -e'$_ = "<head>foo</head>"; s|<head>.*</head>|<head>...</head>|s; CORE::say'
<head>...</head>

正如您所声称的,没有什么比您的代码更能产生...了。当然,如果您在HTML查看器中查看包含<head>...</head>的文件,它将显示为...。要生成呈现为<head>...</head>的HTML,您需要执行一些转义。

$ perl -e'
   use HTML::Escape qw( escape_html );
   $_ = "<head>foo</head>";
   s|<head>.*</head>|<head>...</head>|s;
   CORE::say(escape_html($_));
'
&lt;head&gt;...&lt;/head&gt;

答案 1 :(得分:0)

假设<\head>是一个错误,您的代码将执行您期望的操作。无论您使用什么方法查看结果,都可能是缺少标签的原因。您在浏览器中查看输出吗?

当您删除开头的<时,标签不再看起来像标签,而是显示它们而不是对其进行操作。