传递给函数后取消引用 perl 对象数组
Dereference perl array of objects after pass to function
我对取消引用对象很奇怪。
在我的程序中 oobjtest 我想得到一个对象列表。
步骤:在 perl testprog oobjtest
1)
调用一个 class 方法 my @lo_hashref_objects = oclass::getemall();。
打印它们。
步骤:在 perl 中 class oclass
- 调用另一个class方法获取文件内容
- content-lines 在拆分后存储在数组中 我的@lol 引用
- 通过 return @lol 将此数组传递给函数 getemall。列表数据可以通过 $array_ref->[$i]
访问
- 创建一个新对象my $self = oclass->new;。通过 Setter 函数将数据放入实例变量中。
- 对象有效,请参阅 Getter 函数输出。
- 将对象存储在数组中。通过 $self 和数组寻址可用的对象数据,参见 getemall
- 传递给testprog oobjtest
- 从列表 my @lol 中获取数据失败。缺乏语法知识,但我无法解决。
class 文件
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
测试程序
#!/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:~$
您不能以这种方式调用字符串插值中的方法。
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";
另一种方法是使用 "baby-cart"
print "after call of getemall: @{[$obj_ref->getbez]} \n";
两者都应该正确调用方法并显示数据。
我对取消引用对象很奇怪。
在我的程序中 oobjtest 我想得到一个对象列表。
步骤:在 perl testprog oobjtest 1) 调用一个 class 方法 my @lo_hashref_objects = oclass::getemall();。 打印它们。
步骤:在 perl 中 class oclass
- 调用另一个class方法获取文件内容
- content-lines 在拆分后存储在数组中 我的@lol 引用
- 通过 return @lol 将此数组传递给函数 getemall。列表数据可以通过 $array_ref->[$i] 访问
- 创建一个新对象my $self = oclass->new;。通过 Setter 函数将数据放入实例变量中。
- 对象有效,请参阅 Getter 函数输出。
- 将对象存储在数组中。通过 $self 和数组寻址可用的对象数据,参见 getemall
- 传递给testprog oobjtest
- 从列表 my @lol 中获取数据失败。缺乏语法知识,但我无法解决。
class 文件
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
测试程序
#!/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:~$
您不能以这种方式调用字符串插值中的方法。
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";
另一种方法是使用 "baby-cart"
print "after call of getemall: @{[$obj_ref->getbez]} \n";
两者都应该正确调用方法并显示数据。