bless有兩個參數:對象的引用、類的名稱。
類的名稱是一個字符串,代表了類的類型信息,這是理解bless的關鍵。
所謂bless就是把 類型信息 賦予 實例變量。
[xywang@mnsdev13:~]$ cat Person.pm #!/usr/bin/perl -w package Person; use strict; sub sleep() { my ($self) = @_; my $name = $self->{"name"}; print("$name is person, he is sleeping\n"); } sub study() { my ($self) = @_; my $name = $self->{"name"}; print("$name is person, he is studying\n"); } return 1; [xywang@mnsdev13:~]$ cat Dog.pm #!/usr/bin/perl -w package Dog; use strict; sub sleep() { my ($self) = @_; my $name = $self->{"name"}; print("$name is dog, he is sleeping\n"); } sub bark() { my ($self) = @_; my $name = $self->{"name"}; print("$name is dog, he is barking\n"); } return 1; [xywang@mnsdev13:~]$ cat bless.pl #!/usr/bin/perl use strict; use Person; use Dog; sub main() { my $object = {"name" => "tom"}; # 把"tom"變為人 bless($object, "Person"); $object->sleep(); $object->study(); # 把"tom"變成狗 bless($object, "Dog"); $object->sleep(); $object->bark(); # 再把"tom" 變成人 bless($object, "Person"); $object->sleep(); $object->study(); } &main(); [xywang@mnsdev13:~]$ ./bless.pl tom is person, he is sleeping tom is person, he is studying tom is dog, he is sleeping tom is dog, he is barking tom is person, he is sleeping tom is person, he is studying
以下為錯誤的使用:
[xywang@mnsdev13:~]$ cat wrong_bless.pl #!/usr/bin/perl use strict; use Person; use Dog; sub main() { my $object = {"name" => "tom"}; #沒有把類型信息和$object綁定,因此無法獲知$object有sleep方法 $object->sleep(); $object->study(); } &main(); [xywang@mnsdev13:~]$ ./wrong_bless.pl Can't call method "sleep" on unblessed reference at ./wrong_bless.pl line 11.