Я совершенно не понял, что там происходит. Вы не можете использовать локальный вызов подпрограммы, это проблема, с которой вы сталкиваетесь.
Позволяет использовать пример кода из того, что я знаю, и попытаться объяснить, что на самом деле делает eval.
Это работает, потому что я изменяю переменную, не вызывая другую подпрограмму для изменения моей переменной.
Для того, чтобы он работал так, как вы ожидаете, вам нужно будет создать глубокую копию объекта для изменения в локальной области или что-то в этом роде. (Который я уверен, что это то, что происходит в первую очередь)
местные создают простор для данной скобки, Eval или файла (проблема там)
Если вы были в состоянии получить доступ к элементам непосредственно без вызова метода (неправильная практика IMHO) вы, вероятно, сможете локализовать область действия этого элемента в объекте.
Пример:
name.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'};
}
}
index.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";
Простой если невпечатляющими хак будет просто сохранить исходное значение в новой переменной в верхней части рамки, делать вещи, и восстановить исходное значение в нижней части. – swornabsent
, если вы можете вызывать разные методы (с другой реализацией) внутри блока или внешнего блока, это сработает. –