2009-03-18 5 views
1

Ceci est le texte d'entrée:Pourquoi est-ce que j'obtiens une ligne vide en substituant une chaîne avec '%>' en Perl?

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

et je veux remplacer la référence CSS avec deux lignes:

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

Voici la déclaration 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; 
} 

Et en sortie I obtenir:

<title>Company Selection</title> 

--> 
<link rel="stylesheet" type="text/css" href="<%=basePath%>/<fmt:message key="application.version"/>/css/style_hbpSA_css.jsp" /> 
  • Si je supprime l'élément '%>' à la fin de la première ligne de substitution, la ligne est imprimée.
  • Si la ligne de substitution se termine par '%>', elle est imprimée.
  • Si je me sauve le%, la ligne ne soit pas imprimé

La source entière de mon script:

#!/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; 
} 

Répondre

2

Il vient me est apparu, vous consultez les résultats par un serveur web n'êtes-vous pas? Le <%%> choses devrait être remplacé par un programme de modèle ou côté serveur inclus. Vous ne verrez jamais ce texte. Très probablement, le fichier ../common/cmufx.jsp n'existe pas (par exemple, le chemin est incorrect) ou il ne contient rien. Jetez un oeil à ce que le programme crache sur la ligne de commande. Si c'est ce que vous attendez, le problème se situe ailleurs (par exemple, le chemin vers cmufx.jsp ou votre ssi n'est pas configuré correctement).

Vos données ont un espace où votre regex a /:

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" /> 

En outre, vous utilisez. dans votre regex sans leur échapper. Le . Le caractère d'une regex correspond à n'importe quel caractère autre qu'un saut de ligne (sauf si l'option/s est utilisée). Votre regex devrait probablement ressembler

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

ou

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

selon lequel vous semble moins laid. Le premier échappe à la signification spéciale de., Et le second crée une classe de caractère d'un caractère, le ..

Vous dites que vous avez toujours des problèmes, voici un script complet qui fait la bonne chose, pouvez-vous nous dire où votre code diverge de ceci:

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

Merci pour votre réponse, mais les données sont correctes et il est moi qui introduit la faute de frappe en collant ici. :( J'ai échappé au '.', Mais pas de succès –

+0

Je ne vois aucune différence entre votre script (qui fonctionne bien) et le mien (que j'ai publié dans le corps de la question) Le * seulement * différence est que je lis d'un fichier séparé en appelant 'script.pl FILE_NAME' –

+0

Je pense que slim pourrait être juste alors.Quel système d'exploitation utilisez-vous? Est-ce que les fins de ligne dans le fichier correspondent aux fins de ligne de votre système d'exploitation? –

0

Premièrement, je recommande fortement de ne pas utiliser d'expressions régulières pour manipuler le HTML. Utilisez quelque chose comme HTML::Tree. Néanmoins, quand j'ai essayé votre code, cela a fonctionné.La seule chose que j'ai changé est ce que je suppose était une faute de frappe: votre entrée inclus:

href="../css style_hbpSA_css.jsp" 

Votre modèle est:

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

Je suppose que vous vouliez tous les deux d'être la même (bien qu'il serait encore préférable d'avoir '..' dans le motif).

Une chose que je vérifierais est des fins de ligne bizarres (c'est-à-dire Windows) dans votre fichier d'entrée.

+0

oui c'était une faute de frappe: mes données sont correctes. et oui je suis sur Windows .. –

+0

Vous pouvez donc écrire les deux lignes, mais avec les nouvelles lignes UNIX, ce qui signifie que la seconde ligne écrase la première. – slim

+0

bonne idée, mais ce n'est pas vrai parce que la chaîne '->' est encore imprimée (vérifiez le corps mis à jour de la question) –

0

La réponse est que, après cette substitution, je demande également

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

donc la ligne a été supprimé.

désolé pour la poubelle votre temps et je merci pour toutes les réponses.

0

Il est parce que vous avez une nouvelle ligne après {

s{<link rel="stylesheet" type="text/css" href="../css/style_hbpSA_css.jsp" />}{ #your new line is here 
<%@ include file="../common/cmufx.jsp" %> 
Questions connexes