Единственная прямая ошибка - строка в вашем методе "getter" getContent
:
my $self = @_; # assigns number of elements in the array to $self!
Это пытается присвоить массив скаляру, что не имеет смысла в его нынешнем виде.Вместо этого выполняется вычисление массива по количеству его элементов, а присваивается $self
.Таким образом, в остальной части метода нет объекта в $self
, а только число, здесь 1
.
Если вы включили предупреждения через use warnings;
в верхней части программы, вы получите
Невозможно использовать строку ("1")как ссылка HASH, в то время как «строгие ссылки» используются в ...
для строки, где вы пытаетесь вызвать метод на $self
, сообщая, что ожидаемый объект (hashref) находится вфакт строка.Это дает вам точную строку и информативное, если кратко, диагностическое сообщение .Без включенных предупреждений код спокойно продолжается, но не может работать как ожидалось.
Мораль: Пожалуйста, всегда имейте use warnings
(и use strict
) в начале
Исправление состоит в том, чтобы сделать это «списком присваивания» - присваивать в списке «контекст»
my ($self) = @_;
, где контекст списка накладывается на оператор присваивания =
с помощью (...)
налевая сторона.Теперь элементы в массиве @_
назначаются переменным, перечисленным в ()
, один за одним.Здесь есть только одна переменная на LHS ($self
), поэтому ему присваивается первый элемент @_
, а остальные, если они были, отбрасываются.
Или назначьте один элемент@_
до $self
в скалярном назначении.В объектно-ориентированном коде это часто делается с использованием shift , поэтому для дальнейшего удобства также необходимо удалить объект из списка аргументов
my $self = shift;
, где shift
в подпрограмме по умолчанию работает на@_
.
См. context и Scalar vs Оператор присвоения списка .
Я бы рекомендовал всегда писать класс в своем собственном .pm
файле, который затем use
d в программе.Об обработке ошибок в пакетах см. Carp .