【问题标题】:How can I get a working Data::Alias in Perl 5.12?如何在 Perl 5.12 中获得有效的 Data::Alias?
【发布时间】:2010-05-04 20:55:55
【问题描述】:

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

【问题讨论】:

标签: perl5.12 perl incompatibility


【解决方案1】:

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

作为一个有趣的旁注,随着:= no longer meaning an empty attribute list 的清理,看起来能够做别名可能会在未来成为 Perl 的一项语言功能。对此期待! :)

【讨论】:

  • 我认为 CPAN 中的所有内容都是针对 5.12 候选版本自动测试的?也许发行版中没有涵盖这种情况的单元测试,在这种情况下报告错误将确保它永远不会再次被破坏。 :)
  • @Ether:从 rt 上的线程来看,这不是错误;模块的 XS 代码因内部更改而损坏。至于针对 CPAN 测试候选版本,我不知道,但它似乎没有用,除非您对同一平台上 perl 的先前版本的结果进行矩阵比较。 CPAN 上的许多模块都有故障,这并不意味着 5.12 破坏了它们。 :)
  • rafl 几周前帮我看了一下它,并说它不会太难修复(这对 rafl 来说“太难了”)。他应该这样做,所以 Method::Signatures 可以在 5.12 中工作。
  • 在 CPAN 中测试所有内容与在 CPAN 中通过测试的所有内容不同。 :)
【解决方案2】:

该模块自 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
    

    但与往常一样,在使用动态范围/本地之前,请注意它的实际作用。

  • 词法标量可以用作 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 
    

【讨论】:

  • 引用与别名不同。您展示的示例只是 Data::Alias 功能的有限子集。
  • @brian d foy => 参考示例用于展示替代方法,另外两个示例是我所知道的纯 Perl 别名技术的其余部分。这些当然是一个有限的子集,否则 Data::Alias 可能不会被编写。 OP 要求替代方案
  • 另外,引用与别名完全相同,只是穿着不同。要给某物起别名,您可以将对它的引用放入变量类型 glob 中的适当槽中。无论您对 typeglob 标签使用什么符号都会告诉 Perl 取消引用它,因此 $y 读作“标记为 y 的 typeglob 的标量取消引用”。如果你想详细一点,总是有 *foo{THING} 语法,在这种情况下是 ${*y{SCALAR}}++;
  • 再一次,我从来没有说过没有它可以重新创建Data::Alias 的所有功能。你真的对我在回答中写的任何东西有问题吗? (另外,for my $y ($x) {return sub {$y++}} 构造创建了一个词法别名,诚然在有限的上下文中)
  • Lexical::AliasVariable::Alias 的文档中不清楚它们是否支持alias my $x => $array[5] 之类的东西。也就是说,我可以声明变量作为我的别名,我可以为集合的元素创建别名吗?这是Data::Alias 的两个不错的功能。
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 2011-10-02
    • 1970-01-01
    • 2011-04-29
    • 2012-01-28
    • 2012-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-29
    相关资源
    最近更新 更多