当前位置:  开发笔记 > 编程语言 > 正文

有没有办法在Perl中使用"常量"作为哈希键?

如何解决《有没有办法在Perl中使用"常量"作为哈希键?》经验,为你挑选了6个好方法。

有没有办法使用常量作为哈希键?

例如:

use constant X => 1;

my %x = (X => 'X');

上面的代码将创建一个散列,其中"X"作为键而不是1作为键.然而,我想使用常数X的值作为关键.



1> nohat..:

use constant 实际上是不断的子程序.

要做你想做的事,你需要显式调用sub:

use constant X => 1;

my %x = ( &X => 'X');

要么

use constant X => 1;

my %x = ( X() => 'X');



2> 小智..:

另一个选择是不使用使用常量编译指示并按照Damian Conway的Perl最佳实践中的建议翻转到Readonly.

我意识到常量散列引用只是对散列的一个常量引用,但我没有做任何关于散列内部数据的事情.

readonly语法创建"正常查看"变量,但实际上会强制执行常量或只读.你可以像使用任何其他变量一样使用它.


use Readonly;

Readonly my $CONSTANT => 'Some value';

$hash{$CONSTANT} = 1;


它不是核心模块.

3> cjm..:

你的问题是=>是一个魔术逗号,自动引用它前面的单词.所以你写的相当于('X','X').

最简单的方法是使用逗号:

my %x = (X, 'X');

或者,您可以添加各种标点符号,以便在=>前面不再有简单的单词:

my %x = ( X() => 'X' );
my %x = ( &X => 'X' );



4> Chris..:

使用$hash{CONSTANT()}$hash{+CONSTANT}防止裸字引用机制被踢入.

来自:http://perldoc.perl.org/constant.html



5> jjohn..:

大多数其他人都很好地回答了你的问题.总之,这些创建了对问题的完整解释和推荐的解决方法.问题是Perl pragma"use constant"确实在当前包中创建了一个子例程,其名称是pragma的第一个参数,其值是最后一个.

在Perl中,一旦声明了子例程,就可以在没有parens的情况下调用它.

理解"常量"只是子程序,你可以看到为什么它们没有在字符串中插入,为什么引用左手参数的"胖逗号"运算符"=>"认为你已经把它递给了一个字符串(尝试其他内置的-in函数如time()和keys(),有时使用胖逗号来获得额外的乐趣).

幸运的是,你可以使用像parens或者&符号这样的显式标点来调用常量.

但是,我有一个问题要问:你为什么要使用常量来获取哈希键呢?

我可以想到一些可能会引导您朝这个方向发展的方案:

    您希望控制哈希中的哪些键.

    您希望抽象出密钥的名称,以防以后更改

在数字1的情况下,常量可能不会保存您的哈希值.相反,请考虑创建一个具有公共setter和getter的类,该类填充仅对该对象可见的哈希.这是一个非常不像Perl的解决方案,但很容易做到.

在2号的情况下,我仍然坚持主张一个班级.如果通过定义良好的接口来调节对散列的访问,则只有该类的实现者负责获取正确的散列键名称.在这种情况下,我不会建议使用常量.

希望这有助于并感谢您的时间.



6> Michael Carm..:

use constantpragma创建一个子程序原型,不带参数.虽然它看起来像一个C风格的常量,但它实际上是一个返回常量值的子程序.

=>(脂肪逗号)自动报价左操作如果一个裸字一样,在$ {哈希键}符号.

如果你使用常量名称看起来像一个单词,引用机制将启动,你将得到它的名称作为键而不是它的值.要防止这种情况,请更改用法,使其不是一个单词.例如:

use constant X => 1;
%hash = (X() => 1);
%hash = (+X => 1);
$hash{X()} = 1;
$hash{+X} = 1;

在初始化程序中,您也可以使用普通逗号:

%hash = (X, 1);

推荐阅读
贾志军
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有