通常我们在模块的末尾使用1;
。这表示模块返回true
并且可以正确导入。现在,如果我们返回0
表示false
,则表示模块导入失败。
我的问题是,如果我在模块末尾使用(或返回)以下语句
,该怎么办?-1;
some text;
abc;
-1
表示错误,some text
,abc
表示true
如果我不使用1;
或任何语句(如上所述),那么在这种情况下模块会返回什么呢?
是否会返回undef
?
答案 0 :(得分:4)
任何真实值表示成功。 -1是真值。
返回不必位于文件的末尾;它是最后一个可执行语句的返回值(也就是说,最后一个语句不仅仅是一个编译时的东西,比如package,use,no,sub,format)。
例如,要求包含以下内容的文件:
package foo;
our @x;
sub bar { }
如果@foo :: x为空,将失败,否则成功。
如果确实没有可执行语句,则返回值为undef(false)。
答案 1 :(得分:2)
就像sub一样,模块返回的值是最后一个语句返回的值。我想如果文件是空的那就是undef。 (这绝对不是真正的价值。)
模块应始终返回一个真值(除零以外的任何值,空字符串或undef)。
-1
是真的,所以这是可以接受的。some text
是text->some()
的等效间接方法调用。
text->some()
(及等效)才可接受。我会跟进一个真正的常数来保证安全。abc
是一个等同于abc()
的子程序调用,或者是等同于'abc'
的字符串文字。
abc()
(及等效)才可接受。我会跟进一个真正的常数来保证安全。'abc'
(及等效)是真的,所以这是可以接受的。如果出现错误,请改为die
。但是,如果合理的话,应该避免这种情况,因为如果有人捕获异常,它会使模块半载(半执行)。
答案 2 :(得分:1)
这些都是正确的,模块将编译。然而,在更激进的诊断下,我看到编译器发出关于除1之外的值的警告。实际上这是“1;”可以放在任何一行。我有时把这些放在我调试的代码中间,只是为了得到很好的调试断点线。
由于在最后一个表达式中意外地具有各种真值,很多程序在较低的诊断级别运行没有问题,这些值不一定是最后一行。
$a = "True value to accidentally keep -c happy."; sub hello { return; }