Как я могу получить рабочий Data :: Alias ​​в Perl 5.12? - PullRequest
4 голосов
/ 05 мая 2010

Мне нравится Data::Alias. Кажется, он сломан в 5.12. Это можно исправить? Это будет исправлено в ближайшее время? Есть ли хорошая альтернатива?

Ответы [ 3 ]

10 голосов
/ 05 мая 2010

Любая версия Data::Alias, созданная до версии 1.08 (выпущена 22 октября 2010 года в BST), не будет работать с Perl 5.12, поскольку Data::Alias до 1.08 не работает в Perl 5.12. Обновитесь до последней версии (1.08 или новее), и она должна работать!

В качестве интересного примечания можно предположить, что возможность создавать псевдонимы может появиться в Perl в качестве функции языка в будущем, при этом очистка := больше не означает пустой список атрибутов, С нетерпением жду этого! :)

4 голосов
/ 05 мая 2010

Модуль не обновлялся с 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 
    
0 голосов
/ 15 августа 2010

Я только что нашел другую потенциальную опцию: Scalar::Alias, которая работает в Perl 5.12. Очевидно, это только псевдонимы скаляров, но он не требует жирной запятой вместо знака равенства.

...