Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
传递给函数后取消引用perl对象数组_Perl_Oop - Fatal编程技术网

传递给函数后取消引用perl对象数组

传递给函数后取消引用perl对象数组,perl,oop,Perl,Oop,我对解引用对象很奇怪 在我的程序测试中,我想得到一个对象列表 步骤:在perl testprog oobjtest中 1. 调用类方法my@lo\u hashref\u objects=oclass::getemall;。 打印出来 步骤:在perl类oclass中 调用另一个类方法以获取filecontent 内容行在通过引用拆分到数组my@lol中后存储 通过return@lol将此数组传递给函数getemall。列表数据可通过$array\u ref->[$i]访问 创建一个新对象my$s

我对解引用对象很奇怪

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

步骤:在perl testprog oobjtest中 1. 调用类方法my@lo\u hashref\u objects=oclass::getemall;。 打印出来

步骤:在perl类oclass中

调用另一个类方法以获取filecontent 内容行在通过引用拆分到数组my@lol中后存储 通过return@lol将此数组传递给函数getemall。列表数据可通过$array\u ref->[$i]访问 创建一个新对象my$self=oclass->new;。通过Setter函数将数据放入实例变量中。 对象工作,请参见Getter函数输出。 将对象存储在数组中。通过$self以及通过数组寻址提供的对象数据,请参阅getemall 将其传递给testprog oobjtest 从列表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 ' & ' ];   
        }
        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
部分输出

     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:~$ 

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

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";
将产生

after call of getemall: oclass=HASH(0x55f70e320278)->getbez 
解决这个问题的一个方法是使用

print "after call of getemall: " . $obj_ref->getbez. " \n";
另一种方法是使用


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

在您看到HASH0x….的地方。。。。您可以迭代键=>值对。whilemy$key,$value=each%the_hash{…}如果hash是一个hash ref,你需要先去引用它。在Ted:我必须使用by方法调用getbez等。在line:>>>getemall:CCC,$lo_hashref_对象[$I]->getbez这些lo_hashref_对象听起来像是可以用我描述的while循环迭代的对象。每个hashref引用一个具有0-many key=>value对的散列。在Ted:您的循环直接访问散列数据吗?如果是这样的话,这不是我的答案。是的,正如你在纽约看到的,它们是受祝福的东西。我没有写一个答案,因为我不太确定我是否理解这个问题。我只是想指出你似乎错过的东西。如果有一个hashref,如$hashref,则可以取消引用,并可以使用whilemy$key、$value=each%$hashref{print$key=$value\n;}查看其中的内容。我认为那些散列是个问题,这就是我暗示的原因。在你看到散列0x的地方。。。。您可以迭代键=>值对。whilemy$key,$value=each%the_hash{…}如果hash是一个hash ref,你需要先去引用它。在Ted:我必须使用by方法调用getbez等。在line:>>>getemall:CCC,$lo_hashref_对象[$I]->getbez这些lo_hashref_对象听起来像是可以用我描述的while循环迭代的对象。每个hashref引用一个具有0-many key=>value对的散列。在Ted:您的循环直接访问散列数据吗?如果是这样的话,这不是我的答案。是的,正如你在纽约看到的,它们是受祝福的东西。我没有写一个答案,因为我不太确定我是否理解这个问题。我只是想指出你似乎错过的东西。如果有一个hashref,如$hashref,则可以取消引用,并可以使用whilemy$key、$value=each%$hashref{print$key=$value\n;}查看其中的内容。我认为那些杂烩是个问题,这就是我暗示的原因。