Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Perl: Почему выполняется код? / 6 сообщений из 6, страница 1 из 1
14.06.2013, 12:04
    #38297610
Alibek B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Perl: Почему выполняется код?
Есть такой фрагмент:
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
# Processing
{
  my %dispatch =
    (
      'show' => undef,
      'info' => undef,
      'add' => undef,
      'change' => undef,
      'delete' => undef,
      'update' => undef,
      'clear' => undef,
      'sync' => undef,
      'load' => \&action_load(),
      'get' => undef,
      'put' => undef,
      'link' => undef,
      'unlink' => undef,
      'reset' => undef,
    );
  #foreach my $action (@{$meta->{'actions'}})
  #{
  #  unless (exists($dispatch{$action->{'cmd'}}))
  #  {
  #    print "'$action->{'cmd'}' - unknown command, skipped\n";
  #    next;
  #  }
  #  unless (defined($dispatch{$action->{'cmd'}}))
  #  {
  #    print "'$action->{'cmd'}' - comming soon, skipped\n";
  #    next;
  #  }
  #  $dispatch{$action->{'cmd'}}->($action);
  #}
}

sub action_load($)
{
  print "*** action_load\n";
}



Почему-то несмотря на закомментированный код в консоль выводится текст "*** action_load".
То есть при создании хеша вызывается процедура action_load (хотя должна возвратится ссылка на процедуру).
Что я делаю не так?
________________________
Мы смотрим с оптимизмом...
...в оптический прицел.
...
Рейтинг: 0 / 0
14.06.2013, 12:26
    #38297631
mhx
mhx
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Perl: Почему выполняется код?
Почему-то несмотря на закомментированный код в консоль выводится текст "*** action_load".
Не закомментировано, потому и выводит.
То есть при создании хеша вызывается процедура action_load (хотя должна возвратится ссылка на процедуру).
Что я делаю не так?
Уберите круглые скобки
...
Рейтинг: 0 / 0
14.06.2013, 13:29
    #38297709
Alibek B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Perl: Почему выполняется код?
mhxНе закомментировано, потому и выводит.
Вопрос был о том, почему процедура action_load вообще запускается.

mhxУберите круглые скобки
Да, проглядел.
...
Рейтинг: 0 / 0
14.06.2013, 15:44
    #38297992
Alibek B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Perl: Почему выполняется код?
В принципе теперь все работает. А можно ли обойтись без хеша %dispatch?
Ведь насколько я понимаю, имена всех процедур Perl хранит в каком-то массиве.
Имя процедуры у меня соответствует шаблону action_$command_$object.
Могу ли я проверить, есть ли в коде процедура, соответствующая указанным $command и $object, и если есть, то вызвать ее?
...
Рейтинг: 0 / 0
14.06.2013, 16:18
    #38298046
Alibek B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Perl: Почему выполняется код?
Можно ли вместо такого костыля сделать как-то элегантнее?
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
    my $proc = "action";
    if ($action->{'cmd'})
    {
      $proc .= "_$action->{'cmd'}";
      $proc .= "_$action->{'obj'}" if ($action->{'obj'});
      if ((main->can($proc)))
      {
        no strict 'refs';
        &$proc;
      }
      else {print "Handler '$proc' not exists, skipped\n"}
      &$proc;
    }
...
Рейтинг: 0 / 0
25.11.2013, 06:02
    #38476120
volodin661
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Perl: Почему выполняется код?
Alibek B.В принципе теперь все работает. А можно ли обойтись без хеша %dispatch?
Ведь насколько я понимаю, имена всех процедур Perl хранит в каком-то массиве.
Имя процедуры у меня соответствует шаблону action_$command_$object.
Могу ли я проверить, есть ли в коде процедура, соответствующая указанным $command и $object, и если есть, то вызвать ее?



Отчего же-с, можно-c :

Код: perl
1.
2.
3.
4.
5.
6.
7.
8.
9.
#генерится имя, формируется typeglob, ему присваивается соответств. функция

$command = "Скажите";
$object = "Мууууу";
*{ "action_$command_$object" } = sub { ($arg) = @_; print $arg };


Вызов функции
&{"action_$command_$object"} ( $object );




можно также реализовать в текущем пространстве имён функцию AUTOLOAD
( см. Advanced Perl Programming c [картинкой небезызвестного животного], это кладезь),
которая и будет вызываться при вызове неопределённых на этот момент функций
и делай в ней, что хошь.
...
Рейтинг: 0 / 0
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Perl: Почему выполняется код? / 6 сообщений из 6, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]