Как я могу получить рабочий 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+:

    И поиск "псевдонима" в 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. Очевидно, это только псевдонимы скаляров, но он не требует жирной запятой вместо знака равенства.

Другие вопросы по тегам