Perl中的哈希常量

时间:2010-12-06 19:16:49

标签: perl constants

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

CWA => "Financial",
PIP => "",
IFA => "IFA",
VDX => "Financial,

也就是说,如果文件的名称以CWA开头,我知道我必须使用的目录位于Financial下。如果文件名以IFA开头,我知道目录名是IFA。我想把它设置为哈希(很容易),但由于这些值并没有真正改变,我想设置这个键=>值映射为哈希常量。

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

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

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

实现密钥的最佳方式是什么=>价值常数?

4 个答案:

答案 0 :(得分:9)

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

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

  3. 隐藏子程序中的哈希值。

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

    甚至

    sub get_directory_for_prefix {
        {CWA=>"Financial",PIP=>"",IFA=>"IFA",VOX=>"Financial"}->{shift()};
    };
    

答案 1 :(得分:9)

您可以使用Const::Fast

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

答案 2 :(得分:2)

这是我最后按照一些建议做的事情:

{
    my %appHash = (
        CWA => "Financial",
        PIP => "",
        FIA => "FIA",
        VDX => "Financial",
    );

    sub appDir {
         return $appHash{+shift};
    }
 }

通过将%appHash放在自己的块中,我无法在其余代码中引用该哈希。但是,appDir子例程位于同一个块中,可以引用它。而且,因为子程序是包广泛的,我可以在我的代码中访问该子程序。因此,我可以访问%appHash的值,但我无法更改它们。

 use strict;
 use warnings;
 {
    my %appHash = (
        CWA => "Financial",
        PIP => "",
        FIA => "FIA",
        VDX => "Financial",
    );

    sub appDir {
         return $appHash{+shift};
    }
 }

 {
   ### WARNING.
   ### this code is a counter example to show that %appHash
   ### is not available in this scope.
   ### Do not use this code.
   ### Disabling strictures and warnings in this block only.

   no strict;
   no warnings;  # Danger Will Robinson!
   # disable explicit package name error because %appHash is not defined in this scope.
   # disable warnings related to 1) main::appHash and 2) uninitialized value of $appHash{"CWA"}

   print "The directory for CWA is " . $appHash{CWA} . "\n";    #Prints nothing
 }
 print "The directory for CWA is " . appDir("CWA") . "\n";    #Prints Financial

 my %appHash;
 $appHash{CWA} = "FOO FOO FOO!";

 print "The directory for CWA is " . $appHash{CWA} . "\n";    #Prints FOO FOO FOO!
 print "The directory for CWA is " . appDir("CWA") . "\n";    #Still prints Financial

纯!

感谢iwjhobbs

答案 3 :(得分:1)

或者,如果您不想使用块,您仍然可以使用常量:

use strict;
use warnings;

use constant CONSHASH => sub {{
    foo1 => 'bar1',
    foo2 => 'bar2',
    foo3 => 'bar3',
}->{ +shift }};

print CONSHASH->('foo1') . "\n";
print CONSHASH->('foo2') . "\n";
print CONSHASH->('foo3') . "\n";