Perl中的常见做法当然是结束模块,1;以便可以检查对require的调用是否成功.有没有理由说返回值不是另一个真正的价值?在我的测试中,它不会导致任何问题,但我想知道是否有人遇到任何问题(例如一些其他模块或编译指示或任何期望值实际上1而不仅仅是真实的东西).
编辑:通过流行的观点,因为它只会工作一次(好的提示),代码示例消失了.似乎共识是它可以安全地返回任何真值,但从不依赖于调用代码中的那个值,因为它require会1在第一次加载后返回
Sch*_*ern 17
我已经在模块的末尾放了一些傻事.没有任何伤害,还有一点复活节彩蛋. uny2k有助于以"Yes, this code is a joke." Class :: Fields结束它们.
更进一步,有时当记录函数返回时true,false我将返回1以外的其他内容true.这是惩罚谁写的人if foo() == 1,当他们的意思if foo().这与我写作的时间差不多use constant TRUE => 1==1; use constant FALSE => !TRUE;
我已经看到了生产代码中使用的模块的返回值.我不记得原因.开发商的逻辑被......折磨.我认为这是不希望只写一行而不是两行的事情.我不记得为什么他不只是出口它.
这是过去常常%_传递参数的开发人员(*_符号是跨包的全局),并在map语句中编写了150行地图语句.
除了混淆之外,使用返回值的危险在于它只能工作一次.
$ 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
Run Code Online (Sandbox Code Playgroud)
第一次调用requireFoo.pm并返回返回值.第二个调用看到它已经进入%INC并且只返回true.你甚至不能确定你是第一个要求代码的东西.您可以解决这个问题,do "Foo.pm"但现在您每次都重新加载模块时会发出有关重新定义的例程,性能问题以及可能重新初始化全局变量的警告.这不值得.
任何东西都是有效的返回值.如果你想要require成功,它需要是一个真正的价值.如果您不希望require成功(例如,不支持的平台,缺少库),请使用false值.
要查看其他人用作返回值的内容,请查看Acme :: ReturnValue.
人们不希望将返回值用于任何事情,因此无论当时看起来多么聪明,我都不会通过尝试这样做来混淆人们.:)