代码之家  ›  专栏  ›  技术社区  ›  Mike

Perl,使用Hash的“闭包”

  •  3
  • Mike  · 技术社区  · 14 年前

    我想有一个子例程作为一个散列的成员,它能够访问其他散列成员。

    例如

    sub setup {
      %a = (
       txt => "hello world",
       print_hello => sub {
        print ${txt};
      })
    return %a
    }
    
    my %obj = setup();
    $obj{print_hello};
    

    理想情况下,这将输出“hello world”

    编辑

    抱歉,我没有指定一个要求

    $obj{txt} = "goodbye";
    

    然后输出$obj{print\u hello} goodbye

    3 回复  |  直到 14 年前
        1
  •  7
  •   FMc TLP    14 年前

    如果希望调用代码能够修改散列中的消息,则需要通过引用返回散列。这符合您的要求:

    use strict;
    use warnings;
    
    sub self_expressing_hash {
        my %h;
        %h = (
            msg              => "hello",
            express_yourself => sub { print $h{msg}, "\n" },
        );
        return \%h;
    }
    
    my $h = self_expressing_hash();
    $h->{express_yourself}->();
    
    $h->{msg} = 'goodbye';
    $h->{express_yourself}->();
    

    然而,这是一个奇怪的混合物——本质上是一个包含一些内置行为的数据结构。听起来像是 对我来说。也许你应该为你的项目研究一种O-O方法。

        2
  •  2
  •   friedo    14 年前

    这将起作用:

    sub setup { 
        my %a = ( txt => "hello world" );
        $a{print_hello} = sub { print $a{txt} };
        return %a;
    }
    
    my %obj = setup();
    $obj{print_hello}->();
    
        3
  •  0
  •   Oesor    14 年前

    sub setup {
      my %a = (
       txt => "hello world",
       print_hello => sub {
        print $a{txt};
      });
      return %a;
    }
    
    my %obj = setup();
    $obj{print_hello}->();