为什么Perl中的“import”子程序没有大写?

6
我很好奇。大多数Perl的隐式调用子程序必须使用全大写字母命名,例如TIESCALAR、DESTROY等。实际上perldoc perltoot说:
如果构造函数可以有任意名称,那么为什么析构函数不能呢?因为虽然构造函数是显式调用的,但析构函数不是。销毁是通过Perl的垃圾回收(GC)系统自动发生的,这是一种快速但有些懒惰的基于引用的GC系统。为了知道该调用什么,Perl 坚持要求析构函数被命名为 DESTROY。目前,Perl 对何时调用析构函数的正确时间的概念尚未明确定义,这就是为什么您的析构函数不应依赖于它们被调用的时间。
为什么DESTROY要全部大写?在某些情况下,Perl 会使用纯大写函数名称作为约定来表示该函数将以某种方式由Perl自动调用。其他隐式调用的函数包括 BEGIN、END、AUTOLOAD,以及所有在perltie中描述的绑定对象使用的方法。
为什么import子程序保留小写?有人对此有深刻的见解吗?

1
很抱歉,这并没有一个一致的原因,而且导入(import)小写只是因为历史原因和遗留问题等。 - Alessandro
3个回答

6
我认为 "import" 不是隐式调用的。它是由 use 的实现发出的显式调用。引用自perldoc use

它与以下代码完全等价:

BEGIN { require Module; Module->import( LIST ); }


1
尽管我同意这可能是原因,但我认为从作者和用户的角度来看,这是隐含调用的。 - Joel Berger
或者说这与 tie 调用 TIESCALAR 有何不同?我可以看出 DESTROY 周围有更多的魔法。 - Joel Berger

3

补充一下DVK的回答,有些情况下你确实需要显式地调用import,例如加载可选模块或自动填充命名空间:

eval "require $modulename; $modulename->import( LIST ); ";

我认为在任何情况下都不需要明确调用 DESTROY、TIESCALAR 等函数。


我已经明确使用了 DESTROY 来打破循环引用并确保对象被垃圾回收。通常可以通过使用 weakref 来实现这一点,但这并不总是方便的。 - mirod

1

这只是设计上的疏忽,现在改变已经太晚了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接