Создать класса стека и назначить ему методы

Хочу создать класс - MyClass, который по сути будет являться классом стека. И назначить ему методы. Пытаюсь реализовать хотя бы push. Код файла скрипта:

use 5.32.1;

use strict; 
use warnings;

BEGIN {
    require 'MyClass.pm';
}

use MyClass;

# создаем новый объект
# в конструктор можно было передать дополнительные аргументы
# которые шли бы в sub new() следом за именем класса

my $cl = MyClass->new({stack => (20, 40, 60, 70), item => (80, 100)});


print $cl->push_onto_stack();

Код файла модуля MyClass.pm (в котором хранится класс стека):

use 5.32.1;

package MyClass; {
  use strict;
  use warnings;

  my $stack_size = 20;
  my @stack;

  sub new {
    # получаем имя класса
    my($class, $args) = @_;
    # создаем хэш, содержащий свойства объекта
    my $self = bless  { stack => $args->{stack},
                        item => $args->{item}

    }, $class;
  }

  # метод push_onto_stack();
  sub push_onto_stack {
    my $self = shift;
    die "Overflow\n" if {stack} > 20;
    return push ({stack}, {item});   
  }
}

1; # ok!

Пока что при исполнении файла скрипта возвращает мне - 1. А метод не работает. Битый день не могу врубиться что не так. Помогите, пожалуйста.


Ответы (1 шт):

Автор решения: Infarch

Я еще немного всмотрелся в ваш код и понял что там все слишком запутано чтоб коментировать каждый момент. Поэтому вот рабочий пример, а вы сравните со своей версией

test.pl

use strict; 
use warnings;

use MyClass;


my $cl = MyClass->new();

print $cl->push_onto_stack(10);
print "\n";
print $cl->push_onto_stack(20);

MyClass.pm

package MyClass;

use strict;
use warnings;

my $stack_size = 20;

sub new {
    my($class) = @_;
    
    my $self = {
        stack => []
    };

    return bless $self, $class;
}

# returns the number of elements in the stack
sub push_onto_stack {
    my ($self, $item) = @_;
    die "Overflow\n" if @{$self->{stack}} > $stack_size;
    return push @{$self->{stack}}, $item;
}


1;
→ Ссылка