什么是有效的Perl模块返回值?

时间:2009-12-07 15:54:06

标签: perl module

Perl中的常见做法当然是使用1;结束模块,以便可以检查对require的调用是否成功。有没有理由说返回值不是另一个真正的价值?在我的测试中,它不会导致任何问题,但我想知道是否有人遇到任何问题(例如一些其他模块或编译指示或任何期望值实际为1的任何问题不仅仅是真的。)

编辑:通过流行的观点,并且由于它只能工作一次(好的提示),代码示例消失了。似乎共识是它可以安全地返回任何真正的值,但在调用代码时永远不会依赖于该值,因为require将在第一次加载后返回1

6 个答案:

答案 0 :(得分:17)

我一直在模块的末尾放些傻东西。没有任何伤害,还有一点复活节彩蛋。 "Yes, this code is a joke." uny2ktrue Class::Fields结尾,{{3}}充满了它们。

更进一步,有时当记录一个函数返回falsetrue时,我将返回if foo() == 1以外的其他内容。这是为了惩罚那些写if foo()的人use constant TRUE => 1==1; use constant FALSE => !TRUE;%_这与我写*_

的时间大致相同

我已经看到了生产代码中使用的模块的返回值。我不记得原因。开发商的逻辑被......折磨。我认为这是不希望只写一行而不是两行的事情。我不记得为什么他不只是出口它。

这是使用$ cat Foo.pm package Foo; return "Basset hounds got long ears"; $ cat test.plx #!/usr/bin/perl -w print require Foo, "\n"; print require Foo, "\n"; $ perl -I. test.plx Basset hounds got long ears 1 传递参数的同一个开发人员(require符号是跨的全局)并在map语句中写入150行地图语句。< / p>

除了混淆之外,使用返回值的危险在于它只能运行一次。

%INC

第一次调用do "Foo.pm"会计算Foo.pm并返回返回值。第二个调用看到它已经在{{1}}并且只返回true。你甚至不能确定你是第一个要求代码的东西。您可以使用{{1}}解决此问题,但现在您每次都会重新加载模块,并发出有关重新定义的例程,性能问题以及可能重新初始化全局变量的警告。它不值得。

答案 1 :(得分:8)

我认为(1)从模块中返回任意的真值都没有问题但是(2)你建议利用模块实现的模糊,过于聪明的代码存在问题细节。不要那样做。

答案 2 :(得分:7)

任何东西都是有效的返回值。如果您希望require成功,则需要为真值。如果您不希望require成功(例如,不支持的平台,缺少库),请使用false值。

要查看其他人用作返回值的内容,请查看Acme::ReturnValue

人们不希望将返回值用于任何事情,因此无论当时看起来多么聪明,我都不会通过尝试这样做来混淆人们。 :)

答案 3 :(得分:6)

<{3}}的作者Mark Dominus解释了我的最爱:

  

我很少使用$flag = 'Cogito ergo sum';作为每个人   知道在所有可能的宇宙中都是显而易见的。这确保了   最大可移植性。

答案 4 :(得分:4)

目的是如果您的模块返回false,则require会在此时失败。没有人关心或依赖超越它的真实或错误的价值。

你应该效仿。您正在制作它,以便您的模块取决于实际值,无论它是真还是假。例如,在您提供的示例中,如果您的需求恰好返回1,则require将成功,但您的聪明构造函数将失败。

答案 5 :(得分:1)

使用require会遇到的一件事是它只在第一次加载模块时返回模块的返回值。如果模块已经加载,则需要返回1而不再重新加载模块。

do file语句每次都会重新加载文件,并且每次都返回文件的返回值。我用它以匿名哈希的形式将配置数据存储在文件中。