2009-12-04 85 views
5

我知道标题听起来很可笑,但我发现这个片段的话:我的声明会发生什么?

my MyPackage $p1 = MyPackage->new; 

不包的名称发球的$p1前面什么样的作用?

编辑:我正在运行perl 5.10.1

回答

6

http://perldoc.perl.org/functions/my.html

我喜欢的类型EXPR:ATTRS

我的声明列出的变量是本地(词汇)的封闭块,文件或评估许可证。如果列出多个值,则列表必须放在括号内。

TYPE和ATTRS的确切语义和接口仍在不断发展。 TYPE目前被绑定到字段编译指示的使用,并且使用属性编译指示来处理属性,或者通过属性::处理程序模块从Perl 5.8.0开始。

+0

我在Perl5中这样做。这是新的东西吗? – Geo 2009-12-04 21:36:17

+0

Perl6的这一方面已经在5.10中提供。它不会在5.8和更早版本中工作。 – 2009-12-04 21:38:55

+2

语法自5.8.0版本开始可用 - 它只是在5.8中没有做任何非常有用的操作。 5.10;) – hobbs 2009-12-05 01:40:41

11

它检查具有相同名称的包,并且,截至目前,被拴在fields编译,这有助于您在字段名称的拼写错误。

例如:

package MyPackage; 
use fields qw/ foo bar /; 
sub new { fields::new(shift) } 

然后,如果你尝试运行

use MyPackage; 
my MyPackage $p1 = MyPackage->new; 
print $p1->{notpresent}, "\n"; 

No such class field "notpresent" in variable $p1 of type MyPackage at ... 
+0

这是正确的答案。与Perl 6无关。“受限散列”替换伪散列,但现在很少见到它们。 – Schwern 2009-12-05 09:05:23

0

除了通过场使用,词法类型使用的实验types pragma(可从CPAN获得)。

相关问题