[Moscow.pm] функция не из нашего пакета

Vladimir V. Perepelitsa inthrax на gmail.com
Пн Дек 29 02:02:22 PST 2008


2008/12/29 Dmitry E. Oboukhov <unera на debian.org>:
> VVP> &App::foo и &main::foo это ссылки на одну и ту-же функцию.
> VVP> так что выяснить что является настоящим именем, а что алиасом - неоднозначно.
> VVP> можно к примеру пройтись рекурсивно по всем неймспейсам и найти все
> VVP> имена по равенству ссылок.
> я так (рекурсивным проходом) получаю список ссылок на функции
> а дальше из этого списка хочется выкинуть дубликаты
> но выкинуть именно так, чтобы в первую очередь выкидывались
> импортированные алиасы а не оригиналы. но пока не нашел
> как решить.
>
> кстати, может еще кто подскажет
>
> допустим имеется ссылка на функцию в переменной $c и известен ее glob
>
> пишем враппер:
>
> *{$name}=sub { &$c };

зачем враппер?
*$name = \&$c;

>
> но если функция представляет собой константную функцию (например
> константы в каком-то модуле вроде Errno) то получаем варнинг про
> попытку переопределения константной функции
>
> Constant subroutine ...
>
> Я ковырялся в поисках директивы которая отменяет этот варнинг, но
> не нашел варианта. Так же не нашел можно ли по ссылке на функцию определить
> не константная ли она?
>
> сейчас тупо перехватил варнинг
> $SIG{__WARN__}=sub { $is_constant=1 if $_[0]=~/^Constant sub/ };

константные сабы компилятся и их переопределение вызывает некоторые
"неприятные" для интерпретатора операции.

>
> и после переопределения если $is_constant установлено в true то
> так вылавливаю константные ф-ции. хотелось бы от этого хака избавиться

Вообще на мой взгляд делаете что-то странное :)
Не хотите расписать задачу в более общем виде? Я так думаю есть более
элегантное решение.

-- 
Best wishes,
Vladimir V. Perepelitsa aka Mons <inthrax на gmail.com>


Подробная информация о списке рассылки Moscow-pm