Perl中的常见做法当然是使用1;
结束模块,以便可以检查对require的调用是否成功。有没有理由说返回值不是另一个真正的价值?在我的测试中,它不会导致任何问题,但我想知道是否有人遇到任何问题(例如一些其他模块或编译指示或任何期望值实际为1
的任何问题不仅仅是真的。)
编辑:通过流行的观点,并且由于它只能工作一次(好的提示),代码示例消失了。似乎共识是它可以安全地返回任何真正的值,但在调用代码时永远不会依赖于该值,因为require
将在第一次加载后返回1
答案 0 :(得分:17)
我一直在模块的末尾放些傻东西。没有任何伤害,还有一点复活节彩蛋。 "Yes, this code is a joke."
uny2k以true
Class::Fields结尾,{{3}}充满了它们。
更进一步,有时当记录一个函数返回false
和true
时,我将返回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)
我很少使用
$flag = 'Cogito ergo sum';
作为每个人 知道在所有可能的宇宙中都是显而易见的。这确保了 最大可移植性。
答案 4 :(得分:4)
目的是如果您的模块返回false,则require会在此时失败。没有人关心或依赖超越它的真实或错误的价值。
你应该效仿。您正在制作它,以便您的模块取决于实际值,无论它是真还是假。例如,在您提供的示例中,如果您的需求恰好返回1
,则require将成功,但您的聪明构造函数将失败。
答案 5 :(得分:1)
使用require
会遇到的一件事是它只在第一次加载模块时返回模块的返回值。如果模块已经加载,则需要返回1而不再重新加载模块。
do file
语句每次都会重新加载文件,并且每次都返回文件的返回值。我用它以匿名哈希的形式将配置数据存储在文件中。