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

Eri*_*rom 16 perl module

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

编辑:通过流行的观点,因为它只会工作一次(好的提示),代码示例消失了.似乎共识是它可以安全地返回任何真值,但从不依赖于调用代码中的那个值,因为它require1在第一次加载后返回

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"但现在您每次都重新加载模块时会发出有关重新定义的例程,性能问题以及可能重新初始化全局变量的警告.这不值得.


Jon*_*erg 8

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


bri*_*foy 7

任何东西都是有效的返回值.如果你想要require成功,它需要是一个真正的价值.如果您不希望require成功(例如,不支持的平台,缺少库),请使用false值.

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

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


Gre*_*con 6

高阶Perl的作者Mark Dominus解释了我的最爱:

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