这是我的模块的样子:
#!/usr/bin/perl
package Page;
use strict;
use warnings;
use base qw/DBObj/;
our %fields = (
id => undef,
title => '$',
content => '$'
);
sub get_field_names {
my @names = sort keys \%fields;
return \@names;
}
for my $field ( keys %fields ) {
my $slot = __PACKAGE__ ."::$field";
no strict "refs";
*$field = sub {
my $self = shift;
$self->{$slot} = shift if @_;
return $self->{$slot};
}
}
1;
这里发生奇怪行为的父模块
#!/usr/bin/perl
package DBObj;
use strict;
use warnings;
use Data::Dumper;
use DBConn;
sub new {
my $me = shift;
my $class = ref $me || $me;
my $self = {
dbh => new DBConn->new(
dns => '/db.sql',
user => '',
pass => '',
)
};
return bless $self, $class;
}
sub save {
my $self = shift;
my @field_names = @{$self->get_field_names};
print Dumper @field_names;
foreach my $item ( reverse @field_names ) {
print $item;
}
}
sub fill {
my ( $self, $args ) = @_;
foreach my $key ( keys $args ) {
$self->$key( $args->{$key} );
}
}
1;
这是我正在经历的。这个片段
my @field_names = $self->get_field_names;
print Dumper @field_names;
foreach my $item ( reverse @field_names ) {
print $item;
}
Data :: Dumper显示
$VAR1 = [
'content',
'id',
'title'
];
但foreach循环返回
ARRAY(0x7fc750a26470)
我有一个Test :: Simple测试用例,我执行以下测试
ok( shift $page->get_field_names eq 'content', 'Page has field content');
所以我可以从数组中移出一个项目,但我不能遍历它,这对我来说是一个难题。
请我告诉我,我不应该这样做,并且那里有大量的模块,我应该选择,我想指出;我正在做这个纯粹的乐趣,我已经离开Perl大约10年了,并认为再次玩它会很有趣。
答案 0 :(得分:7)
您已使get_field_names
返回对数组的引用,但您将该引用放入数组变量中。
尝试:
my $field_names = $self->get_field_names;
print Dumper $field_names;
foreach my $item ( reverse @$field_names ) {
print $item;
}
答案 1 :(得分:1)
get_field_names
返回一个arrayref,而不是一个数组。通过从return \@names;
或" cast"中删除反斜杠来更改其返回类型它的返回类型通过写:
my @field_names = @{$self->get_field_names};