Perl OOP方法返回数组我无法循环

时间:2015-02-18 18:14:49

标签: perl

这是我的模块的样子:

#!/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年了,并认为再次玩它会很有趣。

2 个答案:

答案 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};