0に注意
まず,以下のプログラムを見てください.このプログラムは動きます.
#!/usr/bin/perl -w
use strict;
package Foo;
sub new {
return bless {hoge=>10},$_[0];
}
sub hoge{
my($this,$arg)=@_;
$this->{hoge}=$arg if $arg;
return $this->{hoge};
}
package main;
my Foo $aFoo=Foo->new;
print '$aFoo->hoge: ['.$aFoo->hoge."]\n";
$aFoo->hoge(100);
print '$aFoo->hoge: ['.$aFoo->hoge."]\n";
実行結果はこうなります.
bash-2.05$ ./sam.pl $aFoo->hoge: [10] #←初期値:10 $aFoo->hoge: [100] #←新規値:100
上記のプログラムを修正し,$aFooの属性hogeに0を設定します.
#!/usr/bin/perl -w
use strict;
package Foo;
sub new {
return bless {hoge=>10},$_[0];
}
sub hoge{
my($this,$arg)=@_;
$this->{hoge}=$arg if $arg;
return $this->{hoge};
}
package main;
my Foo $aFoo=Foo->new;
print '$aFoo->hoge: ['.$aFoo->hoge."]\n";
$aFoo->hoge(100);
print '$aFoo->hoge: ['.$aFoo->hoge."]\n";
$aFoo->hoge(0); #←hogeに0を指定
print '$aFoo->hoge: ['.$aFoo->hoge."]\n";
実行結果はこうなります.
bash-2.05$ ./sam.pl
$aFoo->hoge: [10]
$aFoo->hoge: [100]
$aFoo->hoge: [100] #←0にならず100のまま.
bash-2.05$
0を設定したにもかかわらず,hogeの値は100のままです.perlでは0はfalseとなるために発生する現象です.つまり,
#!/usr/bin/perl -w
use strict;
package Foo;
sub new {
return bless {hoge=>10},$_[0];
}
sub hoge{
my($this,$arg)=@_;
$this->{hoge}=$arg if $arg; #←hogeの引数に0を指定すると,if $argはif 0となる.結果がfalseになり前の値が残ったまま.
return $this->{hoge};
}
package main;
my Foo $aFoo=Foo->new;
print '$aFoo->hoge: ['.$aFoo->hoge."]\n";
$aFoo->hoge(100);
print '$aFoo->hoge: ['.$aFoo->hoge."]\n";
$aFoo->hoge(0); #←hogeに0を指定
print '$aFoo->hoge: ['.$aFoo->hoge."]\n";
これを避けるためにはif $argをif defined $argとします.
#!/usr/bin/perl -w
use strict;
package Foo;
sub new {
return bless {hoge=>10},$_[0];
}
sub hoge{
my($this,$arg)=@_;
$this->{hoge}=$arg if defined $arg; #←$argがundef以外なら結果はtrueになる.
return $this->{hoge};
}
package main;
my Foo $aFoo=Foo->new;
print '$aFoo->hoge: ['.$aFoo->hoge."]\n";
$aFoo->hoge(100);
print '$aFoo->hoge: ['.$aFoo->hoge."]\n";
$aFoo->hoge(0); #←hogeに0を指定
print '$aFoo->hoge: ['.$aFoo->hoge."]\n";
bash-2.05$ ./sam.pl
$aFoo->hoge: [10]
$aFoo->hoge: [100]
$aFoo->hoge: [0] #←definedを使うと0になる.
bash-2.05$
動作環境は,WindowsNT Workstation 4.0+SP6,cygwin 1.3.3,perl 5.6.1,bash 2.05です.