powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Perl: Почему выполняется код?
6 сообщений из 6, страница 1 из 1
Perl: Почему выполняется код?
    #38297610
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть такой фрагмент:
Код: 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
Perl: Почему выполняется код?
    #38297631
mhx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
mhx
Гость
Почему-то несмотря на закомментированный код в консоль выводится текст "*** action_load".
Не закомментировано, потому и выводит.
То есть при создании хеша вызывается процедура action_load (хотя должна возвратится ссылка на процедуру).
Что я делаю не так?
Уберите круглые скобки
...
Рейтинг: 0 / 0
Perl: Почему выполняется код?
    #38297709
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mhxНе закомментировано, потому и выводит.
Вопрос был о том, почему процедура action_load вообще запускается.

mhxУберите круглые скобки
Да, проглядел.
...
Рейтинг: 0 / 0
Perl: Почему выполняется код?
    #38297992
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В принципе теперь все работает. А можно ли обойтись без хеша %dispatch?
Ведь насколько я понимаю, имена всех процедур Perl хранит в каком-то массиве.
Имя процедуры у меня соответствует шаблону action_$command_$object.
Могу ли я проверить, есть ли в коде процедура, соответствующая указанным $command и $object, и если есть, то вызвать ее?
...
Рейтинг: 0 / 0
Perl: Почему выполняется код?
    #38298046
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно ли вместо такого костыля сделать как-то элегантнее?
Код: 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
Perl: Почему выполняется код?
    #38476120
Фотография volodin661
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
6 сообщений из 6, страница 1 из 1
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Perl: Почему выполняется код?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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