我构建一个Web服务,而不是使用类似工具包的模板系统我使用这样的包模块:
创建页面网址,根据url之前在路径中创建的独立模块中的每个页面,作为参数传递给每个模块一个唯一的哈希引用,其中包含全局标题,页脚和所有其他数据的变量,每个页面中的数据相同(模块) .
main.pl
use strict;
use warnings;
use Handler;
my %mvs = (# my variables
username => $set{user},
titleglobal => '| web System ',
ip => $env->{REMOTE_ADDR}
.........
.........
);
for my $module_url (reverse @all_urls_names ) {
$router->add($module_url, sub {
$module_url->new(\%mvs);
})
}
Run Code Online (Sandbox Code Playgroud)
在模块页面中,我有一些其他模块加载header.pm,footer.pm但是body.pm直接加载到当前模块页面,在本例中为Handler.pm
Handler.pm
package Handler;
use strict;
use warnings;
use Layout::Head;
use Layout::Footer;
my $layout = sub {
my ($head, $body, $footer) = ( Head::new($mvs), thebody($mvs), Footer::new($mvs) );
return <<THE_HTML;
$head
$body
$footer
THE_HTML
};
return [ 200, [ "Content-Type" => "text/html" ], [ $layout->() ] ];
}
sub thebody{
.........
.........
}
Run Code Online (Sandbox Code Playgroud)
我已经完成了这个方法作为参考wordpress布局,所有工作正常和良好.
¿这是构建可维护代码的好方法吗?
注意:我选择这种方式是因为我不想安装更多模块.(用最少量的必要代码解决给定的问题(调试代码少 - 显而易见的加速)
你说你的约束不是安装模块.但是,安装预先编写的模块和创建新模块之间的实际区别是什么?
也许你有部署问题.这是可以理解的.但是,您可以使用Carton之类的东西来创建应用程序.在系统上设置所有内容,您可以灵活地将其部署到不需要的系统.
使用许多CPAN模块,您可以直接从分发中获取库并重用它们.如果他们不使用XS或需要外部库(比如openssl),他们就可以开箱即用.我没有特别建议这一点,但它是可行的.您将获得经过广泛测试的模块以及随附的社区支持.调试的代码较少,因为其他人已经完成了工作!这些都是复杂的系统,你不得不做很多工作,不仅要调试你已经完成的工作,还要发现你应该完成和支持的所有其他事情.我自己彻底改造了一些东西,我已经吸取了教训.
每个人最终都会编写自己的模板系统(每个人都应该成为他们生活经历的一部分).没关系.但是,您应该研究其他系统的功能以及它们是如何进行的,这样您就不会重蹈覆辙.一些模板模块小而简单,可以作为您探索的基础.查看Text :: Template例如:它是两个模块文件,没有依赖项.通过这个练习向您展示了您想要做的事情的隐藏深度和复杂性.
如果你正在制作一个Web框架,你看过Mojolicious吗?它是一个独立的系统,只需要核心Perl模块(尽管您可能仍需要其他东西,如数据库连接等).它有一个很好的模板系统.对于重量较轻的东西(但你能得到多少),你的方法看起来像CGI :: Prototype.看看那个.
最后,避免使用模块,因为你担心安装任何东西可能是你需要面对并完成它的事情.几乎任何系统一开始都有点吓人,并且在你习惯它并学习它是如何工作之后会变得更好.您可能不喜欢CPAN(但"喜欢"与完成工作有什么关系?),但也许您可以从系统包中获得所需的内容.最后,您希望完成更多工作.前面的一点工作可以为您节省大量的工作.
当您遇到安装模块的问题时,我们随时为您提供帮助!:)