Модераторы: korob2001, ginnie
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> особенность ссылок на функции, добавление в табилицу символов 
:(
    Опции темы
KSURi
Дата 16.12.2008, 21:29 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 887
Регистрация: 8.6.2006
Где: Russia

Репутация: 20
Всего: 27



Столкнулся с неявной (для меня) проблемой при отладке. Может кому-то пригодится в будущем.
Был примерно такой код:
Код

my %dispatch = (
  foo => \&foo,
  bar => \&bar,
);

# ...

return unless __PACKAGE__->can($method) # в $method один из ключей %dispatch

# ...

$dispatch{$method}->()

Во время первого запуска я получил ошибку о вызове несуществующего саба. Не понял в чем дело, т.к. у меня есть проверка can для такого случая. Посмотрел код. Оказалось что один из сабов который упомянут в %dispatch действительно не определен (я забыл). Однако проверка can проходила успешно!
Оказывается при упоминании ссылки на саб в таблицу символов добавляется соответствующая запись, даже если такой саб на самом деле не определен.
Код

C:\>perl -MData::Dumper -e"\&foo;print Dumper(\%main::), __PACKAGE__->can('foo')"
$VAR1 = {
...
          'foo' => *::foo,
...
        };
CODE(0x68fb0)


Это сообщение отредактировал(а) KSURi - 16.12.2008, 21:29


--------------------
Died at Life.pl line 21
PM Jabber   Вверх
gcc
Дата 17.12.2008, 00:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Агент алкомафии
****


Профиль
Группа: Участник
Сообщений: 2691
Регистрация: 25.4.2008
Где: %&й

Репутация: 1
Всего: 17



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

Это сообщение отредактировал(а) gcc - 17.12.2008, 00:32
PM WWW ICQ Skype GTalk Jabber   Вверх
KSURi
Дата 17.12.2008, 00:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 887
Регистрация: 8.6.2006
Где: Russia

Репутация: 20
Всего: 27



gcc, не совсем понял, что вы хотите увидеть? Код методов из %dispatch? Или полный код в котором происходит проверка и вызов метода из %dispatch?


--------------------
Died at Life.pl line 21
PM Jabber   Вверх
gcc
Дата 17.12.2008, 04:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Агент алкомафии
****


Профиль
Группа: Участник
Сообщений: 2691
Регистрация: 25.4.2008
Где: %&й

Репутация: 1
Всего: 17



не знаю, нигде не видел чтобы так записывали:
Код

my %dispatch = (
  foo => \&foo,
  bar => \&bar,
);


 &foo это подпрограмма приватная, наверное...
 

Это сообщение отредактировал(а) gcc - 17.12.2008, 06:29
PM WWW ICQ Skype GTalk Jabber   Вверх
KSURi
Дата 17.12.2008, 11:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 887
Регистрация: 8.6.2006
Где: Russia

Репутация: 20
Всего: 27



Это ссылка на подпрограмму.
perldoc perlref


--------------------
Died at Life.pl line 21
PM Jabber   Вверх
ginnie
Дата 17.12.2008, 12:37 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

Репутация: 38
Всего: 49



KSURi, нашел вариант, при котором can отрабатывает правильно:

Код

my %dispatch = (
  foo => *foo{CODE},
  bar => *bar{CODE},
);


Это сообщение отредактировал(а) ginnie - 17.12.2008, 12:40


--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
KSURi
Дата 17.12.2008, 14:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 887
Регистрация: 8.6.2006
Где: Russia

Репутация: 20
Всего: 27



ginnie, спасибо конечно, буду иметь ввиду. Однако, честно говоря, пользоваться таким вариантом мне что-то не хочется... Слишком он какой-то искуственный для меня чтоли... А для некоторых программистов может показаться вообще не понятным.


--------------------
Died at Life.pl line 21
PM Jabber   Вверх
ginnie
Дата 17.12.2008, 15:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

Репутация: 38
Всего: 49



KSURi, не подскажите, в чем искусственность этого варианта? В документации (пункт 7) он описан как альтернативный рабочий.


--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
KSURi
Дата 19.12.2008, 14:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 887
Регистрация: 8.6.2006
Где: Russia

Репутация: 20
Всего: 27



ginnie, "искуственный" не значит "неправильный". Для меня это проявляется в том, что такой способ записи встречается довольно редко. Да и  банально длиннее получается)


--------------------
Died at Life.pl line 21
PM Jabber   Вверх
gcc
Дата 19.12.2008, 20:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Агент алкомафии
****


Профиль
Группа: Участник
Сообщений: 2691
Регистрация: 25.4.2008
Где: %&й

Репутация: 1
Всего: 17



можно еще так:  smile 
Код

my %dispatch = (
# http://perldoc.perl.org/perlref.html#Making-References (Point 7)
  foo => *foo{CODE},
  bar => *bar{CODE},
);


я почти всегда передаю в классы хэши, но иногда надо просто переменную, то так переопределяю:

Код

sub new {
 my ($self, %common) = @_;
.....................
 if ($common{'file'}) {$self = &File($self, $common{'file'})}
..........
}


Код

sub File{
my ($self, $file) = @_;
}




Это сообщение отредактировал(а) gcc - 20.12.2008, 09:47
PM WWW ICQ Skype GTalk Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0821 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.