Perl, «замыкание» с использованием Hash - PullRequest
3 голосов
/ 15 июня 2010

Я хотел бы иметь подпрограмму в качестве члена хэша, которая может иметь доступ к другим членам хэша.

Например

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

my %obj = setup();
$obj{print_hello};

В идеале это выдает "hello world"

EDIT

Извините, мне не удалось указать одно требование

Я должен быть в состоянии сделать

$obj{txt} = "goodbye";

и затем $ obj {print_hello} должен вывести goodbye

Ответы [ 3 ]

7 голосов
/ 15 июня 2010

Если вы хотите, чтобы вызывающий код мог изменять сообщение в хэше, вам нужно вернуть хеш по ссылке.Это делает то, что вы просили:

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}->();

Однако это странная смесь - по сути, структура данных, которая содержит некоторое встроенное поведение.Звучит как объект для меня.Возможно, вам следует изучить ОО-подход для вашего проекта.

2 голосов
/ 15 июня 2010

Это будет работать:

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

my %obj = setup();
$obj{print_hello}->();
0 голосов
/ 15 июня 2010

Закрыть:

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

my %obj = setup();
$obj{print_hello}->();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...