一个文件中有多个Perl包?

一个文件中有多个Perl包?,perl,module,packages,perl-module,Perl,Module,Packages,Perl Module,请列举支持以下说法的所有理由:“每个Perl包都应该放在一个单独的文件中(一个文件中没有几个包)” 例如,我有这样一个代码: { package Classes::City; # ... } { package Classes::Cities; # for lists of multiple cities # ... } 我是否应该将此代码重构为两个独立的.pm文件?(将此问题视为上述问题的一个示例,而不是一个附加的基于意见的问题。我只想要列表参数,而不是基于意见的答案。)主要原因是,当您使用

请列举支持以下说法的所有理由:“每个Perl包都应该放在一个单独的文件中(一个文件中没有几个包)”

例如,我有这样一个代码:

{
package Classes::City;
# ...
}
{
package Classes::Cities; # for lists of multiple cities
# ...
}

我是否应该将此代码重构为两个独立的
.pm
文件?(将此问题视为上述问题的一个示例,而不是一个附加的基于意见的问题。我只想要列表参数,而不是基于意见的答案。)

主要原因是,当您
使用
需要
模块时,Perl会自动为您加载模块,并使用包名。它通过将包名转换为文件系统中的路径并检查该文件的每个
@INC
目录来实现

use Classes::City;
# will be converted to on Linux:
Classes/City.pm
如果在一个文件中同时包含class::City和class::Cities,则在不加载City的情况下无法加载::Cities,因为文件Classes/Cities.pm在
@INC
中的任何位置都不存在

use Classes::City
# blows up

您现在需要跟踪哪些包在哪个文件中。这会让你的生活更艰难。

一个简单的答案是,这不是预期的使用模式,编译器/解释器会以不太明显的方式与你抗争

您的示例与我尝试做的非常相似:创建一个类,然后在同一文件中为原始类创建一个容器类

我发现10次中有8次,我可以让它工作而不会太痛苦

如果原始类包含(比如)访问器的BEGIN块,那么在您尝试使用容器类中的访问器之前,并不总是清楚它们是否被执行。我确信会有一些旋转的组合使这种情况发生,但在这一点上,仅仅使用1包/文件模型似乎更干净


即使从容器类中强制执行
BEGIN{import class;}
,也不一定能够使事情按必要的顺序运行。

您从哪里获得报价?请添加一个源。这可能已经为你指明了解释。我现在能想到几个,但也有例外。@simbabque我不记得我从哪里得到的引述请不要接受我的回答。这不利于其他答案,而且可能会有人有更多的时间和做更多的研究来给出一个比我更好的答案。不要为了更改而更改它,但是的,使用单独的.pm文件可以避免一些问题。这也会使您的用户的生活更加困难。如果您的用户在
Classes::Cities
子例程中收到警告并希望查看源代码,该怎么办?我知道问题是“列出所有原因”,这只是其中一个。