我有一个情况,我有一个应用程序,它映射到我需要在zipfile中处理的目录。映射非常简单:
CWA => "Financial",
PIP => "",
IFA => "IFA",
VDX => "Financial,
也就是说,如果文件的名称以CWA
开头,我知道我必须使用的目录位于Financial
下。如果文件名以IFA
开头,我知道目录名是IFA
。我想把它设置为哈希(很容易),但由于这些值并没有真正改变,我想设置这个键=>值映射为哈希常量。
我不相信这是可能的,所以我想做下一个最好的事情。那会是什么?或者,你能设置一个哈希常量吗?
我正在考虑编写一个传递参数的子例程,它返回正确的值。毕竟,它实际上是常量本身的工作方式,并且它保证了键和值之间的关系不会在整个程序中发生变化。
或者,我可以简单地声明key =>我的程序开头的值关系,希望key =>值对不会被某些东西修改。这将更容易阅读,如果你必须更容易修改,因为它在我的源代码的最顶层。
实现密钥的最佳方式是什么=>价值常数?
答案 0 :(得分:9)
只需使用命名哈希即可。最有可能的是,什么都不会出错。
使用Readonly。这使得哈希像任何其他哈希一样被访问,但除非有人开始在perl内部进行修改,否则无法修改。正如其文档中所述,与常规变量访问相比,它的速度很慢,但它不太可能慢到对您来说很重要。
隐藏子程序中的哈希值。
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
纯!
答案 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";