Perl中的哈希常量

Dav*_* W. 11 perl constants

我有一个情况,我有一个应用程序,它映射到我需要在zipfile中处理的目录.映射非常简单:

CWA => "Financial",
PIP => "",
IFA => "IFA",
VDX => "Financial,
Run Code Online (Sandbox Code Playgroud)

也就是说,如果文件的名称以...开头CWA,我知道我必须使用的目录Financial.如果文件名以a开头IFA,我知道目录名是IFA.我想将其设置为哈希(很容易),但由于这些值并没有真正改变,我想将此key => value mapping设置为哈希常量.

我不相信这是可能的,所以我想做下一个最好的事情.那会是什么?或者,您可以设置哈希常量吗?

我正在考虑编写一个子程序,你传递一个参数,它返回正确的值.毕竟,它实际上是常量本身的工作方式,并且它保证了键和值之间的关系不会在整个程序中发生变化.

或者,我可以在程序开头简单地声明key => value关系,并希望key => value对不会被某些东西修改.这将更容易阅读,如果你必须更容易修改,因为它在我的源代码的最顶层.

实现key => value常量的最佳方法是什么?

Eug*_*ash 10

你可以用Const::Fast.

use Const::Fast;
const my %hash = (
    CWA => "Financial",
    PIP => "",
    IFA => "IFA",
    VDX => "Financial",
);
Run Code Online (Sandbox Code Playgroud)

  • 对Const :: Fast的致谢:"这个模块的界面灵感来自Eric Roode的Readonly.实现的灵感来自于Readonly所做的一切." (4认同)

hob*_*bbs 9

  1. 只需使用命名哈希.最有可能的是,什么都不会出错.

  2. 使用Readonly.这使得哈希像任何其他哈希一样被访问,但除非有人开始在perl内部进行修改,否则无法修改.正如其文档中所述,与常规变量访问相比,它的速度很慢,但它不太可能足够慢,对您来说很重要.

  3. 隐藏子例程中的哈希.

.

sub get_directory_for_prefix {
    my ($prefix) = @_;
    my %map = (
        CWA => "Financial",
        PIP => "",
        IFA => "IFA",
        VDX => "Financial",

    );
    return $map{$prefix};
}
Run Code Online (Sandbox Code Playgroud)

甚至

sub get_directory_for_prefix {
    {CWA=>"Financial",PIP=>"",IFA=>"IFA",VOX=>"Financial"}->{shift()};
};
Run Code Online (Sandbox Code Playgroud)