URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 6747
[ Назад ]

Исходное сообщение
"вставка html файла в стандартный вывод в Perl"

Отправлено astter , 12-Сен-07 18:22 
Конструкция вида:

open (FILE, "myhtml.html");

$myvar1= 123;
$myvar2= 456;
$myvar3= ...;

@f=<FILE>;

print "@d";

выведет html-файл из perl, но если в этом html файле встретится $myvar1 и другие переменные то подстановки не произойдет, так и будет напечатано "$myvar1" вместо "123".

Как в данном случае в Perl можно сделать, чтобы вместо переменных выводились значения?


Содержание

Сообщения в этом обсуждении
"вставка html файла в стандартный вывод в Perl"
Отправлено RebelX , 12-Сен-07 18:56 
Если кол-во переменных и их имена заранее известны, то воспользоваться поиском и заменой в строке.

Еще можно унифицировать имена используемых переменных и менять их в строке на их значения с помощью регулярных выражений и подстановок.


"вставка html файла в стандартный вывод в Perl"
Отправлено andy , 13-Сен-07 04:55 
>Как в данном случае в 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>


Кстати, читать файл в массив в этом случае не совсем удачная идея. Гораздо лучше читать файл построчно, попутно обрабатывая и печатая строки


"вставка html файла в стандартный вывод в Perl"
Отправлено astter , 13-Сен-07 16:47 
Спасибо всем за помощь.

Действительно, видимо правильно будет или 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?>

  <?}?>


"вставка html файла в стандартный вывод в Perl"
Отправлено cat , 14-Сен-07 12:34 
>[оверквотинг удален]
> @f=<FILE>;
>
> print "@d";
>
>выведет html-файл из perl, но если в этом html файле встретится $myvar1
>и другие переменные то подстановки не произойдет, так и будет напечатано
>"$myvar1" вместо "123".
>
>Как в данном случае в Perl можно сделать, чтобы вместо переменных выводились
>значения?

perldoc HTML::Template


"вставка html файла в стандартный вывод в Perl"
Отправлено angra , 21-Сен-07 16:50 
Самый простой способ использовать 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"'