在Perl中本地更改类的属性

tjw*_*992 4 oop perl scope lexical-scope

我在我的一个Perl脚本中遇到了一个奇怪的问题.我有一个Perl对象.在某个范围内,我希望更改其中一个对象属性,但我希望在该属性离开范围后将其恢复为旧值.

例:

my $object = Object->new('name' => 'Bob');
{
     # I know this doesn't work, but it is the best way
     # I can represent what I amd trying to do.
     local $object->name('Lenny');

     # Prints "Lenny"
     print $object->name();
}

# Prints "Bob"
print $object->name();
Run Code Online (Sandbox Code Playgroud)

有没有办法实现这样的事情?

mob*_*mob 5

这可能没有您要求的那么多封装,但您可以local-ize哈希的属性.这输出"CarlLennyCarl"

sub Object::new { bless { _name => $_[1] }, $_[0] } }
sub Object::name { $_[0]->{_name} }

my $obj = Object->new("Carl");
print $obj->name;
{
    local $obj->{_name} = "Lenny";
    print $obj->name;
}
print $obj->name;
Run Code Online (Sandbox Code Playgroud)

您也可以local- 整个方法.这也输出"CarlLennyCarl":

sub Object::new { bless { _name => $_[1] }, $_[0] } }
sub Object::name { $_[0]->{_name} }

my $obj = Object->new("Carl");
print $obj->name;
{
    local *Object::name = sub { "Lenny" };
    print $obj->name;
}
print $obj->name;
Run Code Online (Sandbox Code Playgroud)