通常,一个包开始简单地
package Cat; ... #content !0;
我刚刚发现,从perl 5.14开始,还有“block”语法。
package Cat { ... #content }
这可能是一样的但是要确定,有什么区别吗?
关于1;在包文件的末尾。任何块的返回值作为最后一个求值表达式的值。所以我可以把1结束之前}?要求快乐,有什么区别:
package Cat { ... #content 1; }
和
package Cat { ... #content } 1;
解决方法
当然有区别。第二个变体有一个块。
包声明为subs和全局变量设置当前命名空间。这是正常范围,即范围以文件或eval字符串的结尾或封闭的块结束。
NAME BLOCK语法包就是语法糖
{ package NAME; ...; }
甚至编译成相同的操作码。
虽然包声明在语法上是一个语句,但这不是语义上的;它只是设置编译时属性。因此,最后一个块的最后一个语句是文件的最后一个语句,并没有区别
package Foo; 1;
和
package Foo { 1; }
WRT。最后一句话。
包BLOCK语法很有趣,主要是因为它看起来像其他语言的类Foo {},我想。由于块限制范围,这也使得使用正确的范围变量更容易。认为:
package Foo; our $x = 1; package main; $::x = 42; say $x;
输出:1,因为我们是像我的词法范围,只是宣布一个别名!这可以通过块语法来防止:
package Foo { our $x = 1; } package main { $::x = 42; say $x; }
按预期工作(42),虽然严格不快乐。