Почему я получаю пустую строку при замене строки на «%>» в Perl? - PullRequest
1 голос
/ 18 марта 2009

Это текст ввода:

<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" />
  • Если я удалю элемент '%>' в конце первой замещающей строки, я получу строку для печати. ​​
  • Если замещающая строка заканчивается на «%>», она печатается.
  • Если я выйду из%, строка не будет напечатана

Весь источник моего сценария:

#!/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 ]

2 голосов
/ 18 марта 2009

Меня осенило, вы просматриваете результаты через веб-сервер, не так ли? Материал <%%> должен быть заменен программой-шаблоном или включением на стороне сервера. Вы никогда не увидите этот текст. Скорее всего, файл ../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" />
0 голосов
/ 18 марта 2009

Это потому что у вас новая строка после {

s{<link rel="stylesheet" type="text/css" href="../css/style_hbpSA_css.jsp" />}{ #your new line is here
<%@ include file="../common/cmufx.jsp" %> 
0 голосов
/ 18 марта 2009

Ответ таков: после этой замены я ТАКЖЕ просил

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

поэтому строка была удалена.

Извините, что потратили ваше время, и я благодарю вас за все ответы.

0 голосов
/ 18 марта 2009

Во-первых, я настоятельно рекомендую не использовать регулярные выражения для манипулирования HTML. Используйте что-то вроде HTML :: Tree .

Тем не менее, когда я попробовал ваш код, он работал. Единственное, что я изменил, было то, что я предполагаю, было опечаткой: ваш вклад включал:

href="../css style_hbpSA_css.jsp"

Ваш шаблон был:

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

Полагаю, вы хотели, чтобы оба были одинаковыми (хотя было бы даже лучше иметь '..' в шаблоне).

Одна вещь, которую я хотел бы проверить, - это странные (то есть, Windows) окончания строк во входном файле.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...