首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >函数传递后的对象的Dereference数组

函数传递后的对象的Dereference数组
EN

Stack Overflow用户
提问于 2020-12-11 17:02:06
回答 1查看 90关注 0票数 1

我对取消引用的东西很奇怪。

在我的程序oobjtest中,我想得到一个对象列表。

步骤:在perl 1中)调用类方法@lo_hashref_objects = oclass::getemall();。打印出来。

步骤:在perl类中

  1. 调用另一个类方法来获取文件
  2. 按引用在数组my @lol中拆分后存储的内容行
  3. 通过返回@lol将这个数组传递给getemall函数。列表-数据可通过$array_ref->$i访问
  4. 创建一个$self = oclass->new;的新对象。通过Setter函数将数据放入实例变量中。
  5. 对象工作,请参见Getter函数输出。
  6. 将对象存储在数组中。可通过$self和数组寻址获得的对象数据,请参阅getemall
  7. 把它传递给testprog oobjtest
  8. 从列表中获取数据,我的@lol失败了。缺乏语法知识,但我无法解决它。

类文件

代码语言:javascript
复制
    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 ' & ' ];   
        }
        close $fh or croak "Couldn't close '$verb_file': $Carp::OS_ERROR";  
        for my $array_ref ( @lol ) {
            print "DEBUG _get_file_content: lol\t  @$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: lol\t  @$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

测试程序

代码语言:javascript
复制
    #!/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";
    }

部分输出

代码语言:javascript
复制
     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:~$ 
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-12-12 15:37:38

不能以这种方式调用字符串中的方法--内插。

代码语言:javascript
复制
print "after call of getemall: $obj_ref->getbez \n";

将产生

代码语言:javascript
复制
after call of getemall: oclass=HASH(0x55f70e320278)->getbez 

解决这一问题的一种方法是使用

代码语言:javascript
复制
print "after call of getemall: " . $obj_ref->getbez. " \n";

另一种方法是使用“婴儿车”

代码语言:javascript
复制
print "after call of getemall: @{[$obj_ref->getbez]} \n";

两者都应该正确调用该方法并显示数据。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65255559

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档