我创建了一个像
这样的对象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>,....
关于我如何做到这一点的任何建议?
答案 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 );
}
确保您已启用strict
和warnings
,然后重试。更新您发布的错误等