加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

在Perl中,如何将函数作为另一个函数的参数传递?

发布时间:2020-12-16 06:26:04 所属栏目:大数据 来源:网络整理
导读:我写了以下Perl类: package Menu;use strict;my @MENU_ITEMS;my $HEADER = "Pick one of the options belown";my $INPUT_REQUEST = "Type your selection: ";sub new { my $self = {}; $self-{ITEM} = undef; $self-{HEADER} = undef; $self-{INPUT_REQUES
我写了以下Perl类:

package Menu;
use strict;

my @MENU_ITEMS;
my $HEADER = "Pick one of the options belown";
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;

如果我调用以下perl脚本:

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

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

我将得到以下输出:

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

我想以一种方式修改给定的类,我可以将第二个参数传递给方法addItem()

就像是:
$menu-> addItem(“First Option”,& firstOptionFunction());

当且仅当选择了First Option时,才执行$firstOptionFunction.

有没有办法在Perl中实现这种行为?
谢谢!

解决方法

你想要 pass a reference到子程序.

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

你的addItem方法可能如下所示:

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

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

    return;
}

正如您在评论中提到的,您可能希望不将子例程作为引用传递,而是将其存储在其他位置.像这样的东西可能会起作用:

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' );

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读