如何在Perl 5.12中获得有效的Data :: Alias?

时间:2010-05-04 20:55:55

标签: perl5.12 perl incompatibility

我喜欢Data::Alias。它似乎在5.12中被打破。可以修复吗?它会很快修好吗?有什么好的选择吗?

3 个答案:

答案 0 :(得分:10)

在版本1.08(2010年10月22日发布,BST)之前构建的任何版本的Data::Alias都不能与Perl 5.12一起使用,因为在{2.0}之前的Data::Alias在Perl 5.12中被破坏了。升级到最新版本(1.08或更新版本)它应该可以工作!

作为一个有趣的旁注,似乎能够做别名可能会在未来使用Perl作为语言功能,并清除:= no longer meaning an empty attribute list。对此期待! :)

答案 1 :(得分:4)

该模块自2007年以来尚未更新,但您可以随时向作者发送消息(Matthijs van Duin:xmath@cpan.org)或提交错误报告,如Robert在答案中所述。

以下是一些替代方案:

  • 至于在5.12 +中使用的别名CPAN模块:

    在CPAN上搜索'alias'会出现更多,但似乎没有人提供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 
    

答案 2 :(得分:0)

我刚刚找到了另一个可能的选项:Scalar::Alias,它似乎适用于Perl 5.12。显然,它只是对标量进行别名,但它不需要用逗号来代替等号。