Schrift
[thread]8909[/thread]

RegEx: Platzhalter ersetzen klappt nicht

Leser: 1


<< |< 1 2 3 4 >| >> 33 Einträge, 4 Seiten
Lightman
 2007-04-07 21:40
#75733 #75733
User since
2007-01-31
57 Artikel
BenutzerIn
[default_avatar]
Hallo,

ich möchte ein Array auf Platzhalter der Form <% ... %> untersuchen und diese ersetzen. Nur leider klappt das nicht.

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
my %vars = (
   test => "Perl",
);

my $content  = "";
my @template = ("Blablabla\n", "<% test %>\n", "blablabla\n");

foreach my $row (@template) {
   $row      =~ s/<% ([A-Za-z0-9]+) %>/$vars{$1}/gix;
   $content .= $row;
   print $row;
}


Es wird weiterhin <% test %> ausgegeben. Wo liegt mein Fehler?
PerlProfi
 2007-04-07 21:54
#75734 #75734
User since
2006-11-29
340 Artikel
BenutzerIn
[default_avatar]
Du hast den Platz zwischen den Klammern vergessen.
<% test %> ist nicht gleich <%test%>.

Nimm folgende Regexp:
Code: (dl )
$row =~ s/^<%\s*(\w+)\s*%>$/$vars{$1}/eg;


MfG
Lightman
 2007-04-07 22:59
#75735 #75735
User since
2007-01-31
57 Artikel
BenutzerIn
[default_avatar]
Vielen Dank! :)
Dubu
 2007-04-08 09:27
#75736 #75736
User since
2003-08-04
2145 Artikel
ModeratorIn + EditorIn

user image
Dein "Fehler" war die Verwendung des Modifiers /x. Durch diesen wird unter anderem jeder Whitespace in der Regex ignoriert, somit auch die Leerzeichen, die du nach "<%" und vor "%>" stehen hattest. Der Modifier /i wiederum war unnötig, da du ohnehin "A-Za-z" in der Regex hattest, mit Groß- und Kleinschreibung.

Andererseits ist der Modifier /e, den PerlProfi benutzt, hier auch nicht nötig, da auf der Ersetzungsseite nur eine Variable steht.
PerlProfi
 2007-04-08 11:02
#75737 #75737
User since
2006-11-29
340 Artikel
BenutzerIn
[default_avatar]
[quote=Dubu,08.04.2007, 07:27]Andererseits ist der Modifier /e, den PerlProfi benutzt, hier auch nicht nötig, da auf der Ersetzungsseite nur eine Variable steht.[/quote]
Es kam mir sicherer vor den Ausdruck zu evaluieren, hab ihn vorher nicht getestet.
bloonix
 2007-04-08 20:38
#75738 #75738
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
Hallo Lightman,

mit CPAN:Template geht das auch:

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
use strict;
use warnings;
use Template;

my %vars = (
  test => 'Hello World!',
  another_test => 'How are you?'
);

my $template = new Template;
$template->process(\*DATA, \%vars);

__END__
Content-Type: text/html

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
  <title>Test template</title>
</head>
<body>
<h1>[% test %]</h1>
<h3>[% another_test %]</h3>
</body>
</html>


;)

Gruss,
opi
What is a good module? That's hard to say.
What is good code? That's also hard to say.
One man's Thing of Beauty is another's man's Evil Hack.
Lightman
 2007-04-11 17:16
#75739 #75739
User since
2007-01-31
57 Artikel
BenutzerIn
[default_avatar]
@opi: Ja, ich weiß, dass man solche Lösungen zu hauf im CPAN findet. Aber selber schreiben ist viel lustiger. :)
bloonix
 2007-04-11 18:19
#75740 #75740
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
Mach das. Irgendwann bist du froh, wenn du das Rad nicht immer
selber neu erfinden musst. Spätestens dann, wenn du einen Job,
einen Nebenjob, eine Freundin, ein paar Projekte und dann noch das
winzig kleine Stück freie Zeit für dich hast. ;)
What is a good module? That's hard to say.
What is good code? That's also hard to say.
One man's Thing of Beauty is another's man's Evil Hack.
Lightman
 2007-04-11 18:58
#75741 #75741
User since
2007-01-31
57 Artikel
BenutzerIn
[default_avatar]
Mein kleines CMS ist sowas wie ein Modelleisenbahn-Ersatz. Wenn's fertig ist, macht es keinen Spass mehr damit zu "spielen". Das Interessante ist letztendlich immer noch das basteln (auch wenn während des Studiums nicht viel Zeit dafür bleibt). Bei einem kommerziellen Projekt würde ich mich aber sehr schnell mit CPAN anfreunden. ;)
Lightman
 2007-04-11 19:14
#75742 #75742
User since
2007-01-31
57 Artikel
BenutzerIn
[default_avatar]
By the way: Ich habe da noch ein kleines Problem mit dem regulären Ausdruck. Wenn ein Schlüssel, der im Template aufgeführt wird (z.B. <% test %>) nicht im Hash vorhanden ist, kommt der Fehler "Use of uninitialized value in substitution iterator". D.h. er findet zwar <% ... %>, aber da "test" nicht im Hash steht, kann es nicht ersetzt werden. Kann man das noch irgendwie in den RegEx packen, dass er nur dann ersetzt, wenn der Schlüssel auch vorhanden und damit bekannt ist?
<< |< 1 2 3 4 >| >> 33 Einträge, 4 Seiten



View all threads created 2007-04-07 21:40.