Как я могу получить рабочий Data::Alias в Perl 5.12?
Мне нравится Data::Alias
, Кажется, он сломан в 5.12. Это можно исправить? Это будет исправлено в ближайшее время? Есть ли хорошая альтернатива?
3 ответа
Любая версия Data::Alias
собранный до версии 1.08 (выпущен 22 октября 2010 года BST) не будет работать с Perl 5.12 как Data::Alias
до 1.08 сломан в Perl 5.12. Обновитесь до последней версии (1.08 или новее), и она должна работать!
В качестве интересного примечания, похоже, что возможность создавать псевдонимы может появиться в Perl в качестве языковой функции в будущем, с очисткой :=
больше не означает пустой список атрибутов. С нетерпением жду этого!:)
Модуль не обновлялся с 2007 года, но вы всегда можете отправить сообщение автору (Matthijs van Duin: xmath@cpan.org) или отправить сообщение об ошибке, как Роберт упомянул в своем ответе.
Вот несколько альтернатив:
Что касается дополнительных модулей CPAN для алиасинга, которые работают в 5.12+:
- Переменная:: Псевдоним - чистый синтаксис
- Tie:: Alias - чистое решение Perl
- Lexical:: Alias - чистый синтаксис
- Devel:: LexAlias - немного более низкий уровень
И поиск "псевдонима" в CPAN приводит к еще большему увеличению, однако ни один из них не предоставляет возможности "делать все с псевдонимами в этом утверждении" в Data::Alias. Так до
Data::Alias
исправлено, вы можете использовать один из вышеперечисленных или следующие чистые методы Perl:Perl имеет встроенную поддержку для наложения любой переменной на переменные, которые существуют в таблице символов. Это делается следующим образом:
my $x = 1; our $y; # declare $y in the symbol table for the current package { local *y = \$x; # make $y an alias of $x in the current scope $y++; } print $x; # prints 2
Но, как всегда, знайте, что на самом деле делает динамическая область видимости, прежде чем ее использовать.
Лексический скаляр может использоваться как псевдоним в пределах цикла for:
my $x = 1; for my $y ($x) { $y++; } print $x; # prints 2
этот тип лексического псевдонима может даже быть пропущен из цикла в замыкании, если это необходимо
Вы можете создать псевдонимы массива, используя магию псевдонимов Perl для списков аргументов подпрограммы:
my $x = 1; my $alias = sub{\@_}->($x); # return a reference to its argument list, # which maintains its aliases $$alias[0]++; print $x; # prints 2
но это не дает вам больше функциональности, чем ссылки, просто с другим синтаксисом.
И пример с использованием ссылок Perl:
my $x = 1; my $y = \$x; # take a reference to $x $$y++; # dereference $y print $x; # prints 2
Я просто нашел другой потенциальный вариант: Scalar::Alias
, который, кажется, работает в Perl 5.12. Очевидно, это только псевдонимы скаляров, но он не требует жирной запятой вместо знака равенства.