如何迭代Perl对象

时间:2015-11-28 20:21:07

标签: perl oop

我创建了一个像

这样的对象
my $hex = Hexagram->new();

它有各种方法:

top
bot
chinese
title
meaning

此对象将被多次创建,每次我需要收集和测试上述每种方法的信息。

我想做点什么

foreach my $method ( qw/top bot chinese title meaning/ )
  {
     &gather_info($hex,$method);
  }

然后有类似

的东西
sub gather_info {
  my ($hex,$method) = @_;
  print "What is the $method? ";
  my $response = <STDIN>;
  chomp $response;
  $hex->${method}($reponse);
  .... and other actions ....
  }

但这不起作用。相反,对于每种方法,我似乎必须一次又一次地写出基本的代码结构,这看起来很浪费。

我还尝试过尝试传递方法调用的引用,例如

foreach my $ra ( [\$hex->top, "top"],
                 [\$hex->bot, "bot"],....)
  {
     my ($object_method, $name) = @{$ra};
     &rgather_info($object_method, $name);
  }

,其中

sub $gather_info {
  my ($rhex, $name) = @_;
  print "What is the $name?";
  my $response = <STDIN>;
  chomp $response;
  &{$rhex}($response);
  .... and other actions ....
}

但是这次我收到关于

的错误
Not a CODE reference at <program name> line <line number>,....

关于我如何做到这一点的任何建议?

1 个答案:

答案 0 :(得分:2)

根据perlobj方法,可以使用字符串变量进行调用。

$object->$method( @args );

所以你的foreach循环应该运行正常。或者这个,不那么罗嗦:

use strict;
use warnings;

my $hex = Hexagram->new();
gather_info( $hex, $_ )
    for qw/top bot chinese title meaning/;

sub gather_info {
    my ($hex, $method) = @_;

    print "What is $method?\n";
    my $response = <STDIN>;
    chomp $response;
    $hex->$method( $response );
}

确保您已启用strictwarnings,然后重试。更新您发布的错误等