В вашем методе new()
вы создаете объект T ie :: IxHa sh и сохраняете его внутри тестового объекта.
my %schedulerdata = {};
tie(%schedulerdata, 'Tie::IxHash');
...
$self->{scheduler} = %schedulerdata;
На самом деле, есть пара небольших ошибок там. Во-первых, вы инициализируете свой ha sh ссылкой h sh.
my %schedulerdata = {};
Действительно, вы хотите инициализировать его пустым списком:
my %schedulerdata = ();
Или лучше просто положитесь на Perl, чтобы инициализировать его как пустой ха sh.
my %schedulerdata;
И, во-вторых, вы пытаетесь сохранить ха sh в своем объекте. Но атрибуты объекта могут быть только скалярами, поэтому вам нужно сохранить ссылку на ha sh в вашем объекте.
$self->{scheduler} = \%schedulerdata;
Собрав все это вместе, ваш метод конструктора должен выглядеть следующим образом:
sub new {
my ($class, $name) = @_;
my $self = {};
my %schedulerdata;
tie(%schedulerdata, 'Tie::IxHash');
$self->{name} = $name;
$self->{scheduler} = \%schedulerdata;
bless $self, $class;
return $self;
}
Но эти проблемы не являются причиной того, что это не работает. Это происходит чуть позже - когда вы даете значения своему планировщику. Ваш код выглядит так:
$self->{scheduler} = {
boot_linuxrc => sub{ loadtest("boot/boot_linuxrc"); },
first_boot => sub{ loadtest("installation/first_boot"); }
};
Но подумайте, что это делает. Вы создаете совершенно новый анонимный ха sh и сохраняете ссылку на этот ха sh в своем объекте. Это перезапишет ваш тщательно построенный привязанный ха sh и заменит его стандартным (не привязанным) ха sh.
Чтобы сохранить привязанный характер вашего ха sh, вам необходимо добавьте пары ключ / значение к нему - не перезаписывайте его полностью. Я думаю, что такой код будет работать.
$self->{scheduler}->{boot_linuxrc} = sub{ loadtest("boot/boot_linuxrc"); };
$self->{scheduler}->{first_boot} = sub{ loadtest("installation/first_boot"); };
Примечание: Если ваш код включает use warnings
(и Perl код всегда должен включать use warnings
), тогда строка:
my %schedulerdata = {};
вызвало бы предупреждение:
Ссылка найдена там, где ожидается четный список
Именно поэтому мы всегда рекомендуем включать use warnings
: -)