我喜欢Data::Alias
。它似乎在 5.12 中被打破。可以修复吗?会很快修复吗?有什么不错的选择吗?
3 回答
Data::Alias
在 1.08 版(2010 年 10 月 22 日 BST 发布)之前构建的任何版本都不能与 Perl 5.12 一起使用,因为Data::Alias
1.08 之前的版本在 Perl 5.12 中被破坏。升级到最新版本(1.08 或更高版本),它应该可以工作了!
作为一个有趣的旁注,看起来能够做别名可能会在未来成为 Perl 的一种语言功能,清理:=
不再意味着空属性列表。对此期待!:)
该模块自 2007 年以来一直没有更新,但您可以随时向作者发送消息(Matthijs van Duin:xmath@cpan.org)或提交 Robert 在他的回答中提到的错误报告。
以下是一些替代方案:
至于在 5.12+ 中工作的用于别名的其他 CPAN 模块:
- 变量::别名- 干净的语法
- Tie::Alias - 一个纯粹的 perl 解决方案
- Lexical::Alias - 干净的语法
- Devel::LexAlias - 低一点
在 CPAN 上搜索“别名”的次数更多,但似乎没有一个提供 Data::Alias 的“在此语句中使用别名执行所有操作”功能。所以 until
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
我刚刚找到了另一个可能的选项:Scalar::Alias
,它似乎在 Perl 5.12 中工作。显然,它只是给标量起别名,但不需要用粗逗号代替等号。