2017-10-05 3 views
0

, j'ai donc un code HTML qui est écrit dans une chaîne Perl. Ce code HTML représente un modèle et j'ai besoin d'ajouter des champs à l'exécution. Par exemple:/valeurs Ajout Remplacement de HTML écrit comme une chaîne PERL

$templateHTML.= '<span > %{name} </span> 

Je veux remplacer le% {name} avec la valeur requise. Le regex J'ai essayé est:

$htmlTemplate.=~ s/%{name}/akhil; 

Cela n'a pas fonctionné, aussi est-il un moyen que je peux utiliser remplacer la fonction JavaScript, i.e., je peux convertir la chaîne de perl à chaîne js et le traiter?

Sur demande, le modèle est appelé et les valeurs à ajouter sont transmises en tant que paramètres.

Répondre

0

Cette résolu:

my $find = "%{name}"; 
    my $replace = "had"; 
    $find = quotemeta $find; # escape regex metachars if present 

    $str =~ s/$find/$replace/g; 

Source: http://www.perlmonks.org/?node_id=98357

Donner les valeurs directement, ne fonctionnait pas. Je ne sais pas pourquoi, je vais chercher et revenir.

+0

intérieur regex vous pouvez utiliser '\ Q .. \ e'. En fait '$ str = ~ s /% {nom}/$ replace/g;', cela fonctionnera, dans votre question initiale vous concaténez les valeurs tout en faisant la substitution. – mkHun

0

Vous inventer votre propre système de modèles. Et il semble peu probable que vous inventiez quelque chose d'aussi flexible ou puissant que ceux que nous avons déjà. Donc, je vous recommande d'utiliser quelque chose comme the Template Toolkit à la place.

Mais si vous voulez continuer avec votre plan, vous devriez lire la section correspondante de the FAQ.

How can I expand variables in text strings?

(contribution de brian d foy)

Si vous ne pouvez l'éviter, ne sont pas, ou si vous pouvez utiliser un système de modèles, tels que Text :: Template ou Template Toolkit , faites cela à la place. Vous pourriez même être en mesure de faire le travail avec sprintf ou printf:

my $string = sprintf 'Say hello to %s and %s', $foo, $bar; 

Cependant, pour l'unique cas simple où je ne veux pas sortir un système de modèles complète, je vais utiliser un chaîne qui contient deux variables scalaires Perl. Dans cet exemple, je veux développer $foo et $bar à leur valeurs de variables:

my $foo = 'Fred'; 
    my $bar = 'Barney'; 
    $string = 'Say hello to $foo and $bar'; 

Une façon que je peux faire cela implique l'opérateur de substitution et un double /e drapeau. Le premier /e évalue $1 sur le côté de remplacement et le transforme en $foo. Le second /e commence par $ foo et le remplace par sa valeur. $foo, puis, se transforme en « Fred », et c'est finalement ce qui reste dans la chaîne:

$string =~ s/(\$\w+)/$1/eeg; # 'Say hello to Fred and Barney' 

Le /e ignorera également en silence les violations de stricte, en remplaçant les noms de variables non définies par la chaîne vide. Depuis que je suis en utilisant la, j'ai tous les mêmes problèmes de sécurité que j'ai avec eval sous sa forme de chaîne drapeau /e (deux fois même!). S'il y a quelque chose d'étrange dans $foo, peut-être quelque chose comme @{[ system "rm -rf /" ]}, alors je pourrais avoir moi-même des ennuis.Pour contourner le problème de sécurité, je pourrais également tirer les valeurs d'un hachage au lieu d'évaluer les noms de variables. En utilisant un seul /e, je peux vérifier le hachage pour m'assurer que la valeur existe, et si ce n'est pas le cas, je peux remplacer la valeur manquante par un marqueur, dans ce cas ??? signaler que je manqué quelque chose:

my $string = 'This has $foo and $bar'; 
    my %Replacements = (
     foo => 'Fred', 
     ); 
    # $string =~ s/\$(\w+)/$Replacements{$1}/g; 
    $string =~ s/\$(\w+)/ 
       exists $Replacements{$1} ? $Replacements{$1} : '???' 
       /eg; 
    print $string;