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です.