You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为Mojolicious Lite应用实现<pre>预格式化内容显示?

解决Mojolicious Lite输出<pre>块内容的问题

核心问题分析

你的代码存在两处关键错误:

  1. 渲染配置不匹配:使用text => $ret会让内容被当作纯文本转义,无法适配布局的HTML结构;同时指定的layout => 'default'和实际布局文件名foo.html.ep名称不符。
  2. <pre>标签缩进问题:标签内的缩进会被浏览器保留,导致输出内容开头出现多余空格。

修改步骤

1. 修正路由渲染逻辑

把纯文本渲染改为HTML渲染,匹配正确的布局名称,同时添加HTML字符转义避免格式错乱和安全风险:

#!/usr/bin/env perl
use Mojolicious::Lite -signatures;
use Mojo::Util qw(xml_escape);

get '/foo' => sub ($c) {
  my $id = $c->param("id");
  my $cmd = "perl /home/user/tool.pl -id $id 2>&1";
  my $ret = `$cmd`;
  # 转义HTML特殊字符,避免XSS和格式异常
  $ret = xml_escape($ret);
  $c->render(
    html => $ret,
    layout => 'foo',
    title => '工具输出结果'
  );
};

app->start;

2. 调整布局文件的缩进格式

<pre>标签对空格敏感,移除%= content前的缩进,保证输出内容格式准确:

__DATA__
@@ layouts/foo.html.ep
<!DOCTYPE html>
<html>
  <head>
    <title><%= title %></title>
  </head>
  <body>
<pre>
%= content
</pre>
  </body>
</html>

可选:极简写法(无需单独布局)

如果不需要完整页面结构,可直接在路由里输出包含<pre>的HTML:

get '/foo' => sub ($c) {
  my $id = $c->param("id");
  my $cmd = "perl /home/user/tool.pl -id $id 2>&1";
  my $ret = xml_escape(`$cmd`);
  $c->render(html => "<pre>$ret</pre>");
};

效果验证

访问/foo?id=xxx后,工具的输出会被正确包裹在<pre>标签中,保留原有的换行、空格格式,同时不会出现HTML字符转义异常。

内容的提问来源于stack exchange,提问作者719016

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 13:32:49