Итак, у меня есть класс Perl. Он имеет метод sort()
, и я хочу, чтобы это было более или менее совпадает с встроенной функцией sort()
:Perl переменная scope вопрос
$object->sort(sub ($$) { $_[0] <=> $_[1] });
Но я не могу сделать:
$object->sort(sub { $a <=> $b });
Из-за определения объема. Но модуль List :: Util делает это с reduce()
. Я просмотрел модуль List :: Util, и они делают некоторые довольно неприятные вещи с no strict 'vars'
, чтобы это произошло. Я пробовал это, но безрезультатно.
Полагаю, что reduce()
работает так, как он поступает, потому что он экспортируется в соответствующее пространство имен, и поэтому мой класс не может этого сделать, поскольку функция довольно прочно находится в другом пространстве имен. Правильно ли это, или есть некоторые (несомненно, более отвратительные и необоснованные) способы сделать это в моей ситуации?
Это может быть достаточно хорошо для ваших целей, но оно хрупкое. Нет никакой гарантии, что функция сравнения относится к тому же пакету, что и вызывающий метод 'sort'. Вот где Sub :: Identify входит. – cjm
@cjm - Это правда, и я обязательно рассмотрю Sub :: Identify, но моя большая проблема заключается в том, чтобы заставить его работать вообще, а не заставить его работать в общем случае. Конкретные решения лучше, чем общие отказы. Однако объединение этого ответа с вашим вызовет мне общее решение, что хорошо. –
Хотя получается, что 'sort' builtin имеет ту же проблему. Он предполагает, что функция сравнения исходит из того же пакета, что и вызывающий. Поэтому, если вы можете жить с этим, вы сохраняете зависимость от Sub :: Identify. (Или вы можете условно потребовать Sub :: Identify и вернуться к 'caller', если он не установлен. Но это больше работает.) – cjm