在java中,有一种方法可以在一行中导入一个类及其所有子类:
import java.utils.*
Run Code Online (Sandbox Code Playgroud)
在Perl中,我发现我只能导入特定的类:
use Perl::Utils::Folder;
use Perl::Utils::Classes qw(new run_class);
Run Code Online (Sandbox Code Playgroud)
是否有类似java的方式导入属于树结构的所有东西,只有Perl?
不,没有办法轻松做你想做的事.
您可以在PERL库的文件系统和您遇到的use每个.pm文件中走相关路径(Module::Find正如@DanielBöhmer所建议的那样),但这可能会遗漏一些事情:
这也是一个坏主意,原因如下:
$packagename->new()每个包,则可能会出现语法错误,如果其中一个包只是一个函数库.Net::并不意味着它将遵循其他 - Net::前缀包期望的标准约定.例如,File::Find并File::Tail共享一个前缀,但彼此之间几乎没有关系; 前缀是共同的,因为两个实用程序都以文件作为目标.BEGIN/ INIT时,他们正在编译/等时间.他们中的一些人(遗憾地)做了不同的事情,这取决于他们use相对于其他模块的顺序.模块开发人员解决这个问题的方法是"不要那样做",但对于模块用户来说,它是" use谨慎的,只有在需要时".import您在示例中所做的参数;没有编程方式来定义"符号I"感兴趣的是",因为Perl在编译时没有那种静态分析......至少对于很多调用样式而言都没有."我有一种预感,你正试图减少样板(如:你的所有模块都use在顶部有一大块语句,而且到处都是重复的).有几种方法可以做到这一点,从以下开始:
strict/ warnings和大量测试.Exporter子类,use这些子类是您的所有标准模块,并将您经常使用的函数添加到其中@EXPORTS(或者@EXPORTS将它们自己拼接,或者使用Exporter子子类或其他东西).SUPER)的实例寻址其方法,因此您的子类不必显式包含导入,例如$instance->method_that_calls_an_imported_function_in_the_parent();此外,另外,package.*在Java中使用导入是有争议的,并且在Perl中使用导入具有许多相同的缺点.
在Perl中,类 Foo::Bar::Foo可能不是一个子类的Foo::Bar.也不保证子类模块甚至具有相同的类前缀.IO::File是一个子类,IO::Handle而不是IO一个模块.
还有一种简单的方法可以告诉Perl模块是另一个Perl模块的子类.有(至少)三种方法来声明子类与类的关系:
use parentuse base@ISA包变量它可以使用@INC查找所有的模块,再看看源看看use parent,use base和@ISA声明,并建立一个Perl类基质,然后再通过矩阵加载你需要的类.这可能是缓慢而繁琐的,甚至不包括基于穆斯的课程.
你问的是错误的问题.你问"查找特定类的所有子类. ".这将包括你可能甚至不感兴趣的类.我知道(例如LWP)可能有几十个不同的类和子类包含你甚至不感兴趣的东西.
您应该问的是" 我需要做什么? ",然后找到满足您需求的课程.如果这些类恰好是特定父类的子类,则这些子类将加载所需的类.
我们在这里进行Java编程,其中一个标准是不在我们的import语句中使用星号.这被认为是草率的编程.如果你需要一个特定的类,你应该声明它而不是简单地声明一个超类.我们的许多报告工具都存在import语句中星号声明的问题.
有一个Module::Find模块,但我不确定它是如何工作的.我相信它只是假设子类与超类在同一模块层次结构中,但这在Perl中远非如此.