blessとisa

スカラ変数に記憶した値の種類を判定する関数isaは,blessの有無によって複数の使い方ができます.まず, オブジェクトSamを定義した場合です.

#!/usr/bin/perl -w
use strict;
use UNIVERSAL qw(isa);

package Sam;
sub new{
  return bless {},shift;
}

package main;
my $aSam=Sam->new;
print 'isa($aSam,\'San\'): '.isa($aSam,'Sam')."\n"; # (1)
print '$aSam->isa(\'Sam\'): '.$aSam->isa('Sam')."\n"; # (2)
  

クラスSamのインスタンス$aSumisa関数の第一引数として指定するやり方(1)と,クラスSamのメソッドとしてisaを呼ぶやり方(2)の二通りが可能となります.実行結果は以下の通り同じです.

$ Sam.pl
isa($aSam,'San'): 1
$aSam->isa('Sam'): 1
  

blessがないとメソッドisaを呼ぶ記述はエラーになります.以下のコードを実行すると

#!/usr/bin/perl -w
use strict;
use UNIVERSAL qw(isa);

my $array=[1,2,3,4,5];
print 'isa($array,\'ARRAY\'): '.isa($array,'ARRAY')."\n";
print '$array->isa(\'ARRAY\'): '.$array->isa('ARRAY')."\n"; # $arrayのメソッドisaを呼ぶ
  

このような結果となります.

$ Array.pl
isa($array,'ARRAY'): 1
Can't call method "isa" on unblessed reference at ./sam.pl line 7.
  

blessを使うとこうなります.

#!/usr/bin/perl -w
use strict;
use UNIVERSAL qw(isa);

bless $array,'Arr'; # $arrayをArrのクラスにする
print 'isa($array,\'Arr\'): '.isa($array,'Arr')."\n";
print '$array->isa(\'Arr\'): '.$array->isa('Arr')."\n"; # $arrayのメソッドisaを呼ぶ
  
$ Array.pl
isa($array,'Arr'): 1
$array->isa('Arr'): 1