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

Rya*_*son 5 perl incompatibility perl5.12

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

Rob*_*t P 11

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

作为一个有趣的旁注,看起来能够做别名可能会在未来将Perl作为一种语言功能,清理:= 不再是一个空的属性列表.对此期待!:)

  • 测试CPAN中的所有内容与通过其测试的CPAN中的所有内容不同.:) (7认同)
  • 几个星期前rafl为我看了一眼并说它不会太难修复(这对于rafl来说太难了).他应该这样做,所以Method :: Signatures可以在5.12中工作. (2认同)

Eri*_*rom 5

自2007年以来,该模块尚未进行过更新,但是您始终可以向作者发送消息(Matthijs van Duin:xmath@cpan.org),也可以提交错误报告,如Robert在他的回答中提到的那样。

以下是一些替代方案:

  • 至于在5.12+中有效的用于别名的其他CPAN模块:

    在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
    
    Run Code Online (Sandbox Code Playgroud)

    但是,与往常一样,在使用动态范围/局部变量之前,请先对其进行实际操作。

  • 词汇标量可以在for循环范围内用作别名:

    my $x = 1;
    for my $y ($x) {
        $y++;
    }
    print $x;  # prints 2
    
    Run Code Online (Sandbox Code Playgroud)

    如果需要,这种词法别名甚至可以在闭包中传递出循环

  • 您可以使用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
    
    Run Code Online (Sandbox Code Playgroud)

    但这实际上并没有为您提供比引用更多的功能,只是使用了不同的语法。

  • 还有一个使用Perl引用的示例:

    my $x = 1;   
    my $y = \$x;  # take a reference to $x
    $$y++;        # dereference $y
    print $x;     # prints 2 
    
    Run Code Online (Sandbox Code Playgroud)

  • 别名不仅可以处理包变量,还可以处理其他内容。 (2认同)