Нужно вот так:
$obj->property=$value;
В действительности же Perl 5 со всеми своими музями и мышами не может предложить ничего лучше:
$obj->property($value);
В простых случаях я благополучно обходил это использованием «sub :lvalue», но проблема в том, что такой подход не работает, если нужно проконтролировать, что присваивается свойству объекта или, тем паче, если нужно как-то отреагировать на изменение свойства (бумага->температура_поверхности_ф=451).
Собственно, я так понимаю, что слабая надежда может быть только на tied variable, возвращаемую методом с типом :lvalue? Т.е. tied variable сама проверит, присваивают ли ей что-то разумное или нет, а если нет - выдаст confess/die.
Пока не пробовал, каюсь, но интересно вообще глобальное мнение на тему того, как обойти ограничения lvalue-sub'ов в perl.
Спасибо!
ОТВЕТ:
#!/usr/bin/perl
package O::O;
use Sentinel;
sub new {
bless {"p"=>"v"}, shift
}
sub p :lvalue {
sentinel obj=>shift,
get=>"get_p",
set=>"set_p";
}
sub get_p {
$_[0]->{"p"}
}
sub set_p {
die 'FYAH!' if $_[1]==5;
$_[0]->{"p"}=$_[1]
}
package main;
my $O=O::O->new();
$O->p=6;
print $O->p,"\n";
$O->p=5;