Разыменование perl-массива объектов после перехода к функции

#perl #oop

#perl #ооп

Вопрос:

Я странный с разыменованием объектов.

В моем prog oobjtest я хочу получить список объектов.

Шаги: в perl testprog oobjtest 1) Вызовите метод класса my @lo_hashref_objects = oclass::getemall(); . Распечатайте их.

Шаги: в классе perl oclass

  1. вызовите другой метод класса, чтобы получить filecontent
  2. строки содержимого сохраняются после разделения в массиве my @lol по ссылке
  3. передайте этот массив функции getemall с помощью return @lol . Список-данные доступны с помощью $array_ref->[$i]
  4. Создайте новый объект my $self = oclass->new;. Поместите данные в переменные экземпляра с помощью функций-установщиков.
  5. Объекты работают, см. Вывод функции получения.
  6. Храните объекты в массиве. Данные объектов, доступные через $self, а также через адресацию массива, см. getemall
  7. Передайте его в testprog oobjtest
  8. Получение данных из списка my @lol завершается неудачей. Недостаток знаний синтаксиса, но я не могу его решить.

Файл класса

     package oclass;

    use warnings;
    use strict;
    use Carp;
    # to make your class data a file-scoped lexical
    my $Census = 0;

    use feature qw/say switch/;
    use lib qw(/home/hj/lib/perl/oo/test);
    our $verb_file = '/home/hj/lib/perl/oo/test/data/verb.txt';
    #-----------------------------------------------------------
    sub new 
    {
        my $class = shift;
        my $self = {};
    
        $self->{bez} = undef;
        $self->{etym} = undef;

        # "private" data
        $self->{"_CENSUS"} = $Census;

        bless ($self, $class);
           ${ $self->{"_CENSUS"} };
        return $self;
    }


    # class method
    sub _get_file_content
    {
        my ($class_name) = @_;
        open my $fh, "<:encoding(UTF-8)", $verb_file or die;
        my @lol = ();
        while (<$fh>) {
            chomp;
            # gather lines per reference in list lol
            push @lol, [ split ' amp; ' ];   
        }
        close $fh or croak "Couldn't close '$verb_file': $Carp::OS_ERROR";  
        for my $array_ref ( @lol ) {
            print "DEBUG _get_file_content: lolt  @$array_ref , n";
            for (my $i = 0; $i <= $#$array_ref; $i  ) {
                say "$i: ", $array_ref->[$i];
            }
        }
        return @lol;   
    } # end _get_file_content


    sub getemall
    {
        my @lol = ();
        my @lo_hashref_objects = ();
        @lol = oclass::_get_file_content();

        for my $array_ref ( @lol ) {
            print "getemall: lolt  @$array_ref , n";
            for (my $i = 0; $i <= $#$array_ref; $i  ) {
                say "$i: ", $array_ref->[$i];
            }
        }
    
        my $i = 0;
        for my $array_ref ( @lol ) {
            my $self = oclass->new;
            $self->setbez($array_ref->[0]);
            $self->setetym($array_ref->[1]);
            say $self->getbez;
            say $self->getetym;
    
            push @lo_hashref_objects, $self;
    
            print "getemall:CCC", $lo_hashref_objects[$i]->getbez, " n";
            print "getemakk: C1C1C1: ", $lo_hashref_objects[$i]->getetym, " n";
            $i  ;
        }

        return @lo_hashref_objects;
    } # end getemall

    #-----------------------------------------------------------
    sub getbez {
        my $self = shift;
        return $self->{bez};
    }
    sub setbez {
        my ($self, $bez) = @_;
            croak('Usage: $self->setbez($bez)') if @_ < 2;
            $self->{bez}= $bez;
        return;
    }

    sub setetym {
        my $self = shift;
        if (@_) { @{ $self->{etym} } = @_ }
        return @{ $self->{etym} };
    }   
    sub getetym {
        my $self = shift;
        return @{ $self->{etym} };
    }

    1; # so the require or use succeeds
 

Тестовая программа

     #!/usr/bin/perl
    #
    use warnings;
    use strict;
    use Carp;

    use lib qw(/home/hj/lib/perl/oo/test);

    use oclass;

    ### call the class method "getemall" to gather all the single lines in  file (data)
    my @lo_hashref_objects = oclass::getemall();
    my $i=0;
    for my $obj_ref ( @lo_hashref_objects ) {
        print " nafter call of getemall: $obj_ref n";
        print "after call of getemall: $obj_ref->getbez n";
        print "ref obj_ref: ", ref($obj_ref), "n";
        print "after call of getemall: $obj_ref n";
        print "afterlo_hashref_object: $lo_hashref_objects[$i  ]->getbez n";

        print "after call of getemall: $obj_ref->getetym n";
    }
 

Вывод частично

      der
    Versuch
    getemall:CCC der 
    getemakk: C1C1C1: Versuch 
    die
    Verbindung
    getemall:CCC die 
    getemakk: C1C1C1: Verbindung 

    after call of getemall: oclass=HASH(0x55f70e320278) 
    after call of getemall: oclass=HASH(0x55f70e320278)->getbez 
    ref obj_ref: oclass
    after call of getemall: oclass=HASH(0x55f70e320278) 
    afterlo_hashref_object: oclass=HASH(0x55f70e320278)->getbez 
    
    hj@debian:~$ 
 

Комментарии:

1. В тех местах, где вы видите HASH(0x....) , вы можете перебирать пары ключ => значение . while(my ($key, $value) = each %the_hash) { ...} Если хэш является ссылкой на хэш, вам нужно сначала разыменовать его.

2. на Ted: я должен использовать вызовы методов by (getbez и т. Д.). В строке: >>>»getemall:CCC», $lo_hashref_objects[$i]->getbez<<< это возможно. На мой взгляд, тот же случай, но…

3. Они lo_hashref_objects звучат как объекты, которые вы могли бы перебирать с while помощью цикла, который я описал. Каждая ссылка на хэш ссылается на хэш с 0-многими парами ключ => значение .

4. на Ted: ваш цикл напрямую обращается к хэш-данным? Если да, то это не ответ, имхо. Да, это благословенные объекты, как вы можете видеть в new()

5. Я не написал ответа, так как не совсем уверен, что понимаю вопрос. Я просто пытаюсь указать на вещи, которые вы, похоже, пропустили. Если у вас есть один hashref (например $hashref ), вы разыменовываете и можете посмотреть, что в нем while(my ($key, $value) = each %$hashref) { print "$key = $valuen"; } есть. Я думал, что HASH эти штуки были проблемой, вот почему я намекнул на это.

Ответ №1:

Вы не можете вызывать методы в строке-интерполяции таким образом.

 print "after call of getemall: $obj_ref->getbez n";
 

приведет к

 after call of getemall: oclass=HASH(0x55f70e320278)->getbez 
 

Один из способов решить эту проблему — использовать

 print "after call of getemall: " . $obj_ref->getbez. " n";
 

другим способом было бы использовать «детскую корзину»

 print "after call of getemall: @{[$obj_ref->getbez]} n";
 

Оба должны правильно вызывать метод и отображать данные.