为什么在用'%>'替换字符串时会得到一个空行?在Perl?

时间:2009-03-18 15:31:14

标签: perl

这是输入文字:

<title>Company Selection</title>
<link rel="stylesheet" type="text/css" href="../css/style_hbpSA_css.jsp" />

我想用两行替换CSS引用:

<%@ include file="../common/cmufx.jsp" %>
<link rel="stylesheet" type="text/css" href="<%=basePath%>/<fmt:message key="application.version"/>/css/style_hbpSA_css.jsp" />

以下是Perl声明:

while(<>){
    s{<link rel="stylesheet" type="text/css" href="../css/style_hbpSA_css.jsp" />}{
--><%@ include file="../common/cmufx.jsp" %> 
<link rel="stylesheet" type="text/css" href="<%=basePath%>/<fmt:message key="application.version"/>/css/style_hbpSA_css.jsp" />;};
print;
}

在输出中我得到:

<title>Company Selection</title>

-->
<link rel="stylesheet" type="text/css" href="<%=basePath%>/<fmt:message key="application.version"/>/css/style_hbpSA_css.jsp" />
  • 如果我删除'%&gt;'在第一个替换行的末尾,我得到了要打印的行。
  • 如果替换行以'%&gt;'结尾,则会打印出来。
  • 如果我逃避%,则不会打印该行

我的剧本的全部来源:

#!/usr/bin/perl

use strict;
use warnings;


while(<>){
    s{<link rel="stylesheet" type="text/css" href="../css/style_hbpSA_css.jsp" />}{
--><%@ include file="../common/cmufx.jsp" %>
<link rel="stylesheet" type="text/css" href="<%=basePath%>/<fmt:message key="application.version"/>/css/style_hbpSA_css.jsp" />;};

    s{<link rel="stylesheet" type="text/css" href="../css/style_hbp_css.jsp" />}{
<link rel="stylesheet" type="text/css" href="<%=basePath%>/<fmt:message key="application.version"/>/css/style_hbp_css.jsp" />};

    s{<%@ include file="../common/cmufx.jsp" %>}{};

    s{../img/banner.jpg}{<%=basePath%>/<fmt:message key="application.version"/>/img/banner.jpg};

    print;
}

4 个答案:

答案 0 :(得分:2)

它刚刚恍然大悟,你正在通过网络服务器查看结果不是吗? &lt; %%&gt;东西应该由模板程序或服务器端包括替换。你永远不会看到那个文字。很可能文件../common/cmufx.jsp不存在(例如路径错误)或者它什么都不包含。看看程序在命令行上吐出的内容。如果它是您所期望的那么问题就在其他地方(例如,cmufx.jsp的路径或您的ssi未正确设置)。

您的数据有一个空格,您的正则表达式具有/:

data                                               V
<link rel="stylesheet" type="text/css" href="../css style_hbpSA_css.jsp" />
regex                                              V
<link rel="stylesheet" type="text/css" href="../css/style_hbpSA_css.jsp" />

此外,您正在使用。在你的正则表达式而不逃避它们。的。正则表达式中的字符匹配换行符以外的任何字符(除非使用/ s选项)。您的正则表达式应该看起来像

s{<link rel="stylesheet" type="text/css" href="\.\./css style_hbpSA_css\.jsp" />}{}

s{<link rel="stylesheet" type="text/css" href="[.][.]/css style_hbpSA_css[.]jsp" />}{}

取决于哪个看起来不那么难看。第一个逃脱了。的特殊含义,第二个创建了一个字符的字符类,..

你说你还有问题,这是一个完整的脚本做正确的事情,你能告诉我们你的代码与此有何不同:

#!/usr/bin/perl

use strict;
use warnings;

while(<DATA>){
s{<link rel="stylesheet" type="text/css" href="../css/style_hbpSA_css.jsp" />}{
<%@ include file="../common/cmufx.jsp" %> 
<link rel="stylesheet" type="text/css" href="<%=basePath%>/<fmt:message key="application.version"/>/css/style_hbpSA_css.jsp" />;};
print;
}

__DATA__
<title>Company Selection</title>
<link rel="stylesheet" type="text/css" href="../css/style_hbpSA_css.jsp" />

答案 1 :(得分:0)

首先,我强烈建议不要使用正则表达式来操作HTML。使用类似HTML::Tree的内容。

尽管如此,当我尝试使用您的代码时,它仍然有用。我唯一改变的是我认为是一个错字:你的输入包括:

href="../css style_hbpSA_css.jsp"

你的模式是:

href="../css/style_hbpSA_css.jsp"

我假设你想要两者都一样(虽然在模式中加上'..'会更好。)

我要检查的一件事是输入文件中的奇怪(即Windows)行结尾。

答案 2 :(得分:0)

答案是在替换之后,我还要求

s{<%@ include file="../common/cmufx.jsp" %>}{};

因此这条线被删除了。

抱歉捣乱你的时间,我感谢你获取所有答案。

答案 3 :(得分:0)

这是因为你在{

之后有一个新行
s{<link rel="stylesheet" type="text/css" href="../css/style_hbpSA_css.jsp" />}{ #your new line is here
<%@ include file="../common/cmufx.jsp" %>