Perl 使用HTML::Template添加标记

Perl 使用HTML::Template添加标记,perl,cgi,perl-html-template,Perl,Cgi,Perl Html Template,我正在使用CGI和。我需要在包含标签的所有模板中添加以下标签(标签应添加在标签中) 我不想手动编辑所有模板文件。有什么方法可以做到这一点吗?在创建HTML::Template的构造函数时可以传递的某种类型的钩子 HTML::Template中是否有任何方法可用于此操作 又是这个吗?;)不,您需要读取和操作DOM来执行您想要的操作。HTML::Template仅适用于其特定的标记/标记。将$template->output()存储到变量中。使用解析器读取变量,例如查找表单实例并附加内容。此示例

我正在使用CGI和。我需要在包含
标签的所有模板中添加以下标签(标签应添加在
标签中)


我不想手动编辑所有模板文件。有什么方法可以做到这一点吗?在创建HTML::Template的构造函数时可以传递的某种类型的钩子

HTML::Template中是否有任何方法可用于此操作

又是这个吗?;)不,您需要读取和操作DOM来执行您想要的操作。HTML::Template仅适用于其特定的标记/标记。将
$template->output()
存储到变量中。使用解析器读取变量,例如查找表单实例并附加内容。此示例说明了一种解决方案:

#!/usr/bin/perl
use strict;
use warnings;
use Mojo::DOM;

# fake output of $template->output;

my $html = << 'HTML';
  <html>
    <head>
      <title>test</title>
    </head>
    <body>
      <form method="post">
        <input type="text" id="name">
      </form>
    </body>
  </html>
HTML

# you say you want to parse this from CGI
my $value ='foo'; 

# what you want to add
my $addme = "<input type='hidden' value='$value'>";

my $dom = Mojo::DOM->new();

$dom->parse( $html )->at('form')->child_nodes->first->append( $addme )->root;
print $dom;
#/usr/bin/perl
严格使用;
使用警告;
使用Mojo::DOM;
#$template->output的假输出;
my$html=new();
$dom->parse($html)->at('form')->child_节点->first->append($addme)->root;
打印$dom;
印刷品:

  <html>
    <head>
          <title>test</title>
        </head>
        <body>
          <form method="post">
            <input type="hidden" value="foo"><input id="name" type="text">
          </form>
        </body>
  </html>

测验
编辑


因为我们不知道您在模板中做什么,所以最明智的方法是根据现有代码的输出进行任何更改。这意味着您可以在当前打印模板输出之前安全地添加上述方法。您可以使用作为一次性更新提供的代码将更改实际写回模板,并且值而不是
foo
可以是HTML::Template参数。

您不必手动修改所有模板文件。Perl有HTML解析器,可以帮助您找到需要进行更改的位置。继续修复模板一次,而不是每次运行时都修改代码。下面,我使用
\*数据
进行说明,但很明显,模板文件列表可能来自任何地方

首先备份文件(更好的是,确保在版本控制系统的分支中执行此操作)

#/usr/bin/env perl
使用utf8;
严格使用;
使用警告;
使用开放qw[:标准:编码(UTF-8)];
使用HTML::TokeParser::Simple;
run(\@ARGV);
分段{
我的$argv=班次;
my$parser=HTML::TokeParser::Simple->new(句柄=>\*数据);
while(my$token=$parser->get_token){
按原样打印$token->;
如果($token->is\u start\u标记('form')){
打印qq{\n\n};
}
}
}
__资料__
这是一张表格:
日期:

如果这可能是一个反复出现的问题,请添加一个包含隐藏标签的标签。(请记住正确地退出)@FtLie上次他们问这个问题时,他们表示根本不想编辑模板文件:编辑,在问题中“我不想手动编辑所有模板文件”@对不起,我误解了你的意思。是的,这是另一个选项,但问题是为了获得渲染模板,我们需要对
$template->output
执行操作。在不知道模板具体在做什么的情况下,上述方法实际上是更好的选择。您不必手动修改所有模板文件。Perl有HTML解析器,可以帮助您找到需要进行更改的位置。继续修复模板一次,而不是每次运行都修改代码。@SinanÜnür我下面的例子可以做到this@Dr.Avalanche当然总的来说,我不是一个slurpy方法的粉丝,除非你必须使用它们,但我也投票支持你的答案。我们在聊天中讨论的解决方案是否有效?
  <html>
    <head>
          <title>test</title>
        </head>
        <body>
          <form method="post">
            <input type="hidden" value="foo"><input id="name" type="text">
          </form>
        </body>
  </html>
#!/usr/bin/env perl

use utf8;
use strict;
use warnings;
use open qw[ :std :encoding(UTF-8) ];

use HTML::TokeParser::Simple;

run(\@ARGV);

sub run {
    my $argv = shift;
    my $parser = HTML::TokeParser::Simple->new(handle => \*DATA);

    while (my $token = $parser->get_token) {
        print $token->as_is;
        if ($token->is_start_tag('form')) {
            print qq{\n<input type="hidden" name="sid" value="<TMPL_VAR NAME=SID>">\n};
        }
    }
}

__DATA__
<h3>Here is a form:</h3>

<form
    method="POST"
    action="https://example.com/action-action-action.pl"
    id="action"
    name="actionable_form">

<label for="date">Date:</label>
<input type="date" name="date" id="date">

<input type="submit">

</form>