2012-05-09 46 views
5

tôi viết Lớp Perl sau:Trong Perl, làm cách nào để chuyển một hàm làm đối số của một hàm khác?

package Menu; 
use strict; 

my @MENU_ITEMS; 
my $HEADER = "Pick one of the options below\n"; 
my $INPUT_REQUEST = "Type your selection: "; 

sub new { 
    my $self = {}; 
    $self->{ITEM} = undef; 
    $self->{HEADER} = undef; 
    $self->{INPUT_REQUEST} = undef; 
    bless($self); 
    return $self; 
} 

sub setHeader { 
    my $self = shift; 
    if(@_) { $self->{HEADER} = shift } 
    $HEADER = $self->{HEADER}."\n"; 
} 

sub setInputRequest { 
    my $self = shift; 
    if(@_) { $self->{INPUT_REQUEST} = shift } 
    $INPUT_REQUEST = $self->{INPUT_REQUEST}." "; 
} 

sub addItem { 
    my $self = shift; 
    if(@_) { $self->{ITEM} = shift } 
    push(@MENU_ITEMS, $self->{ITEM}); 
    } 

sub getMenu { 
    my $formatted_menu .= $HEADER; 
    my $it=1; 
    foreach(@MENU_ITEMS) { 
     $formatted_menu.=$it.". ".$_."\n"; 
     $it++ 
     } 
    $formatted_menu.=$INPUT_REQUEST; 
    return $formatted_menu; 
} 
1; 

Nếu tôi gọi là kịch bản perl sau:

#!/usr/bin/perl 
use strict; 
use Menu; 

my $menu = Menu->new(); 
$menu->addItem("First Option"); 
$menu->addItem("Second Option"); 
print $menu->getMenu; 

tôi sẽ nhận được kết quả như sau:

Pick one of the options below 
1. First Option 
2. Second Option 
Type your selection: 

Tôi muốn để sửa đổi lớp đã cho theo cách mà tôi có thể chuyển đối số thứ hai cho phương thức addItem()

cái gì đó như: $menu->addItem("First Option", &firstOptionFunction());

khi và chỉ khiFirst Option được chọn, sau đó $firstOptionFunction được thực thi.

Có cách nào để đạt được hành vi như vậy trong Perl không? Cảm ơn!

Trả lời

6

Bạn muốn pass a reference cho chương trình con.

$menu->addItem("First Option", \&firstOptionFunction); 

Và phương pháp addItem của bạn có thể trông như thế này:

sub addItem { ## your logic may vary 
    my ($self, $option, $code) = @_; 
    if ($option eq 'First Option') { 
     $code->(); 
    } 

    $self->{ITEM} = $option; 
    push @MENU_ITEMS, $option; 

    return; 
} 

Như bạn đề cập trong các ý kiến, bạn có thể muốn không vượt qua được chương trình con như một tài liệu tham khảo, nhưng thay vì lưu nó ở một nơi khác. Một cái gì đó như thế này có thể hoạt động:

sub new { 
    my $class = shift; 
    my $self = bless {}, $class; 
    $self->{f_o_code} = \&firstOptionFunction; ## use a better name than f_o_code 
    return $self; 
} 

## add your other methods 

sub addItem { ## your logic may vary 
    my ($self, $option) = @_; 
    if ($option eq 'First Option') { 
     $self->{f_o_code}->(); 
    } 

    $self->{ITEM} = $option; 
    push @MENU_ITEMS, $option; 

    return; 
} ## call like $menu->addItem('First Option'); 
+0

và cách tôi xử lý bên trong phương thức addItem? Tôi khá mới đối với Perl, chưa đầy một vài tuần. Tôi đã suy nghĩ về một cái gì đó tương tự, cố gắng tìm một cách để có được một tham chiếu đến vị trí trong bộ nhớ mọi chức năng có, nhưng tôi mặc dù nó sẽ là quá khó khăn để đạt được. – ILikeTacos

+0

Bạn luôn có thể lưu trữ code_ref bằng $ tự như '$ self -> {first_op_code} = \ & firstOptionFunction;' và không vượt qua tham chiếu. – gpojd

+0

Tuyệt vời! Tôi sẽ cố gắng tinh chỉnh mã mà bạn đã đăng và xem liệu tôi có thể làm cho nó hoạt động không! Cảm ơn nhiều. – ILikeTacos

Các vấn đề liên quan