我的宣言会发生什么?

Geo*_*Geo 5 oop perl

我知道标题听起来很有趣,但我发现这个片段在某个地方:

my MyPackage $p1 = MyPackage->new;
Run Code Online (Sandbox Code Playgroud)

包裹的名称在面前扮演什么角色$p1

编辑:我正在运行perl 5.10.1.

Gre*_*con 11

它检查具有相同名称的包,并且截至目前,它与fieldspragma 绑定,这有助于检查字段名称中的拼写错误.

例如:

package MyPackage;
use fields qw/ foo bar /;
sub new { fields::new(shift) }
Run Code Online (Sandbox Code Playgroud)

然后,如果你试图运行

use MyPackage;
my MyPackage $p1 = MyPackage->new;
print $p1->{notpresent}, "\n";
Run Code Online (Sandbox Code Playgroud)

你得到

No such class field "notpresent" in variable $p1 of type MyPackage at ...
Run Code Online (Sandbox Code Playgroud)


Iva*_*uev 6

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

我的TYPE EXPR:ATTRS

我声明列出的变量是封闭的块,文件或eval的本地(词法).如果列出了多个值,则列表必须放在括号中.

TYPE和ATTRS的确切语义和接口仍在不断发展.TYPE当前绑定使用字段pragma,属性使用属性pragma处理,或者从Perl 5.8.0开始也通过Attribute :: Handlers模块处理.

  • 从5.8.0开始,语法已经可用 - 它在5.8中没有做任何有用的事情.它在5.10中也没有做任何有用的事情;) (2认同)
  • 我的狗$ spot自5.005以来一直存在,当它被允许输入类型词汇但从未真正做过任何事情.它只是尝试优化伪哈希,如果你不知道什么伪哈希认为自己很幸运.这些天"我的Class $ obj = Class-> new"唯一的做法就是告诉你作者过去常常使用伪哈希. (2认同)