3

CGI.pm 示例依赖列表连接而不是字符串连接是否有原因?两者可以互换吗?思考

print q->hidden(-name =>'rm', -value => $var).
      q->submit(-name =>"rm$var");

对比

print q->hidden(-name =>'rm', -value => $var),
      q->submit(-name =>"rm$var");

我有一个具体的要求。从字符串构建页面非常方便。毕竟,perl 将标量字符串理解为基本类型。

但是,我对字符串 concat 上下文中的一些奇怪行为感到完全困惑。具体来说,我偶尔遇到过隐藏中的 $var 与提交按钮中的不一样的情况。我可以解决这个问题,但我宁愿理解 CGI.pm 。

有人可以解释一下字符串 concat 是否应该工作吗?

4

2 回答 2

3

除非您更改 的默认值$,

print EXPR1, EXPR2;

print EXPR1 . EXPR2;

如果表达式不是特定于上下文的,则产生相同的结果。有问题的函数总是返回一个 HTML 字符串,所以你很好。

于 2015-02-16T01:58:25.677 回答
3

没错,这两个示例具有相同的效果(好吧,正如 ikegami 所说,除非您已更改$,)。当然,唯一的区别是,在第一个示例中,print传递了一个字符串,而在第二个示例中,它得到了两个。

但是您是否阅读过最新版本的 CGI.pm 文档中有关 HTML 生成功能的评论?

不再维护 CGI.pm 中的所有 HTML 生成功能。任何问题、错误或补丁都将被拒绝,除非它们与根本上损坏的页面渲染有关。

这样做的基本原理是 CGI.pm 的 HTML 生成功能充其量是一种混淆,最坏的情况是维护噩梦。您应该使用模板引擎来更好地分离关注点。有关将 CGI.pm 与 Template::Toolkit 模块一起使用的示例,请参阅 CGI::Alternatives。

这些函数以及它们的 perldoc 将继续存在于 CGI.pm 的 v4 版本中,但可能在 v5 及更高版本中被弃用(软)。

我会认真考虑从这些功能(实际上是 CGI.pm 本身)转移到新的工作。

于 2015-02-16T10:44:51.290 回答