Конструкция вида:open (FILE, "myhtml.html");
$myvar1= 123;
$myvar2= 456;
$myvar3= ...;@f=<FILE>;
print "@d";
выведет html-файл из perl, но если в этом html файле встретится $myvar1 и другие переменные то подстановки не произойдет, так и будет напечатано "$myvar1" вместо "123".
Как в данном случае в Perl можно сделать, чтобы вместо переменных выводились значения?
Если кол-во переменных и их имена заранее известны, то воспользоваться поиском и заменой в строке.Еще можно унифицировать имена используемых переменных и менять их в строке на их значения с помощью регулярных выражений и подстановок.
>Как в данном случае в Perl можно сделать, чтобы вместо переменных выводились
>значения?как правильно было сказано выше, необходимо с помощью регулярных выражений менять название переменной на ее значение (модификатор "e"). Навроде такого:
[admin@comm perl]$ cat ./html_var_subst
#!/usr/bin/perl
use strict;
use warnings;
use vars qw( оG %VARS );
sub main;оG = (
html_file => 'html_var_subst.html'
);%VARS = (
title => 'this is title',
announce => 'another text'
);main;
sub main {
if( open( F, '<', $CFG{html_file} ) ) {
while( <F> ) {
s|\${([a-zA-Z_]+[a-zA-Z0-9_]*)}| exists $VARS{$1} ? $VARS{$1} : "<span class=\"error\">unknown var [$1]</span>" |gie;
print;
}
close( F );
} else {
die "Can not open [$CFG{html_file}], $!\n";
}
}
[admin@comm perl]$ cat ./html_var_subst.html
<html>
<head>
<title>${title}</title>
</head>
<body>
<h1>${title}</h1>
<p>${announce}</p>
<p>unknown: ${unknown}</p>
</body>
</html>
Кстати, читать файл в массив в этом случае не совсем удачная идея. Гораздо лучше читать файл построчно, попутно обрабатывая и печатая строки
Спасибо всем за помощь.Действительно, видимо правильно будет или 1)создавать перечень переменных или 2)унифицировать имена чтобы регексп захватывал их все.
Еще нашел модуль CGI::Embedder, вроде бы позволяет использовать в html-файле синтаксис со вставкой переменных вида <? ...> как в PHP:
NAME
CGI::Embedder - Module for HTML embedding in your Perl programs.
----------------------------------------------------------------SYNOPSIS
#!/usr/local/bin/perl -w
use CGI::Embedder;
...
CGI::Embedder::ExpandFile("tmpl.htm"); # where tmpl.htm is:
<h1>Hello</h1>
<?for(my $i=10; $i<20; $i++) {?>
Hello, world N$i!
$i * $i = <?=$i*$i?><?}?>
>[оверквотинг удален]
> @f=<FILE>;
>
> print "@d";
>
>выведет html-файл из perl, но если в этом html файле встретится $myvar1
>и другие переменные то подстановки не произойдет, так и будет напечатано
>"$myvar1" вместо "123".
>
>Как в данном случае в Perl можно сделать, чтобы вместо переменных выводились
>значения?perldoc HTML::Template
Самый простой способ использовать HTML::Template или HTML::Template::Pro. Если по каким-либо причинам хочется обойтись без этого - используйте eval, например так:
$cat t.htm
<html>
<head>
<title>$title</title>
</head>
</html>$perl -e 'open FH,"t.htm";undef $/;$s=<FH>;$title="asdf";$s1="\$s2=\"$s\";";eval $s1; print "$s\n$s1\n$s2\n"'