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