设置Perl模块结构

设置Perl模块结构,第1张

概述我无法弄清楚如何以面向对象的方式构造Perl模块,因此我可以让一个父模块具有多个子模块,并且只有所需的特定子模块才会被调用脚本加载.例如,我希望能够像这样进行方法调用: use Example::API; my $api = Example::API->new();my $user = {};$user->{'id'} = '12345';$api->Authenticate() 我无法弄清楚如何以面向对象的方式构造Perl模块,因此我可以让一个父模块具有多个子模块,并且只有所需的特定子模块才会被调用脚本加载.例如,我希望能够像这样进行方法调用:

use Example::API;    my $API = Example::API->new();my $user = {};$user->{'ID'} = '12345';$API->Authenticate();$user->{'info'} = $API->Users->Get($user->{'ID'});$user->{'frIEnds'} = $API->FrIEnds->Get($user->{'ID'});

在文件结构方面,我希望将模块设置如下,或者以任何结构使一切正常工作:

API.pmusers.pmfrIEnds.pm...

我想首先这样做的原因是,如果有人只想对API进行身份验证,他们就不必加载所有其他模块.同样,如果有人只想获取用户的信息,他们就不必加载frIEnds.pm模块,只需加载users.pm.如果您能提供必要的示例Perl代码来设置每个模块以及解释如何设置文件结构,我将不胜感激.如果我想要完成我想要完成的任何事情,我会很感激地解释最好的方法和一些关于如何设置的示例代码.

解决方法 从您的示例中,在您的主模块中,我假设您将提供访问器方法来获取子类.所以你要做的就是包括require Sub :: Module;在该方法的顶部.编译时不会发生任何事情,但第一次运行代码时,perl将加载模块.第一次加载后,该行需要Sub :: Module;将成为一个无 *** 作.

如果所有代码都是面向对象的,则无需担心导入函数.但如果你这样做,声明使用Module qw(a b c);被解释为:

BEGIN {    require Module;    Module->import(qw(a b c));}

BEGIN使它在编译时发生,但没有什么能阻止你在运行时使用内部.您在运行时导入的任何子例程都必须使用括号调用,并且原型将不起作用,因此除非您知道自己在做什么,否则运行时导入可能是个坏主意.运行时需要和通过包方法访问是完全安全的.

所以你的$API-> Users方法可能会像这样工作:

# in package 'Example::API' in the file 'Example/API.pm'sub Users {    require Example::API::Users;  # loads the file 'Example/API/Users.pm'    return  Example::API::Users->new( @_ ); # or any other arguments}

在上面的示例中,我展示了包名称和它们所在文件之间的两个转换.通常,所有::都更改为/并将.pm添加到结尾.然后perl将在全局变量@INC的所有目录中搜索该文件.您可以查看require的文档以获取所有详细信息.

更新:

缓存此方法的一种方法是在运行时使用仅返回值的函数替换它:

sub Users {    require Example::API::Users;    my $users = Example::API::Users->new;    no warnings 'redefine';    *Users = sub {$users};    $users}
总结

以上是内存溢出为你收集整理的设置Perl模块结构全部内容,希望文章能够帮你解决设置Perl模块结构所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1239259.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存