このアーカイブは同期化されません。 mixi の日記が更新されても、このアーカイブには反映されません。
lvalue が任意のサブルーチンに使えるということは、
クラスインスタンスのメソッドとしても使えるということだ。
理由は、Perl におけるメソッドが、
単に、クラスの名前と同じパッケージに定義された、
サブルーチンであるからである。
サブルーチンをメソッドとして使う場合、
暗黙に一つ目の引数としてインスタンスが渡される。
それだけの差なのだ。
では、前に作った Employee クラスの、
salary メソッドに lvalue を適用してみよう。
========== Employee.pm ==========
package Employee;
use v5.6.1;
use strict;
use warnings;
BEGIN {
our $Version = '0.03';
}
sub new {
my ($package, %identity) = @_;
$package = (ref $package or $package or __PACKAGE__);
bless(\%identity, $package);
}
sub name {
$_[0]->{'name'};
}
sub gender {
$_[0]->{'gender'};
}
sub weight {
$_[0]->{'weight'};
}
sub salary : lvalue {
$_[0]->{'salary'};
}
1;
========== end of Employee.pm ==========
Perl のサブルーチンでは、return 文を使わなくとも、
ブロックの一番最後の式の評価結果が、戻り値となる。
そのため、salary 以外のルーチンも
return を省略して記述することができるのだ。
では、Jack の給料を上げてみよう。
========== EmployeeTest.pl ==========
#!/usr/local/bin/perl
use strict;
use warnings;
use lib '.';
use Employee;
my $jack = Employee->new(
'name' => 'Jack',
'gender' => 'male',
'salary' => 160000,
'weight' => '65kg',
);
$\ = "\n";
print "Salary: ", $jack->salary;
$jack->salary = 200000;
print "Salary: ", $jack->salary;
========== end of EmployeeTest.pl ==========
実行してみる。
$ ./EmployeeTest.pl
Salary: 160000
Salary: 200000
どうだろうか。プロパティとしての構文が達成できた。