2015-11-28 402 views
2

我創造了這樣一個對象作爲如何遍歷

my $hex = Hexagram->new(); 

對Perl對象的方法,它有多種方法:

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>,.... 

關於如何做到這一點的任何建議?

+3

你是什麼意思「這不行」? '$ obj - > $ method(@args)'是有效的Perl。 – choroba

回答

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啓用你,然後再試一次。更新你的帖子有錯誤等。