5

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

4

3 回答 3

11

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

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

于 2010-05-04T21:01:27.243 回答
5

该模块自 2007 年以来一直没有更新,但您可以随时向作者发送消息(Matthijs van Duin:xmath@cpan.org)或提交 Robert 在他的回答中提到的错误报告。

以下是一些替代方案:

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

    在 CPAN 上搜索“别名”的次数更多,但似乎没有一个提供 Data::Alias 的“在此语句中使用别名执行所有操作”功能。所以 untilData::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 
    
于 2010-05-04T21:03:41.877 回答
0

我刚刚找到了另一个可能的选项:Scalar::Alias,它似乎在 Perl 5.12 中工作。显然,它只是给标量起别名,但不需要用粗逗号代替等号。

于 2010-08-15T08:48:41.283 回答