我完全误解了那里发生的事情。您不能在子例程调用中使用本地,这就是您遇到的问题。
让我们使用一个我知道有效的代码示例,并尝试解释 eval 实际在做什么。
#!/usr/bin/perl
use strict;
use warnings;
use Data::Dumper;
use Cwd;
print getcwd() . "\n";
eval{
local @INC = ('/tmp');
require 'test.pl';
print 'local: ' . Dumper(\@INC);
};
print Dumper(\@INC);
这很有效,因为我正在修改一个变量,而不是调用另一个子程序来修改我的变量。
为了使其按预期工作,您必须创建对象的深层副本以在本地范围或类似范围内进行修改。(我很确定首先发生了什么)
local 为给定的括号、eval 或文件创建范围(你的问题在那里)
如果您能够在没有方法调用的情况下直接访问元素(糟糕的做法恕我直言),您可能能够本地化该元素在对象中的范围。
例子:
名称.pm:
package name;
use strict;
use warnings;
{
sub new {
my ($class,$name) = @_;
my $self = bless {}, $class;
$self->{'name'} = $name if defined $name;
return $self;
}
sub name
{
my ($self,$name) = @_;
$self->{'name'} = $name if defined $name;
return $self->{'name'};
}
}
索引.pl:
#!/usr/bin/perl -w
use strict;
use warnings FATAL => 'all';
use name;
my $obj = name->new('test');
print $obj->{'name'} . "\n";
{
local $obj->{'name'} = 'test2';
print $obj->{'name'} . "\n";
}
print $obj->{'name'} . "\n";