Perl设置Hash键值的常量值

时间:2015-06-04 14:20:28

标签: perl hashmap constants

有没有办法将Perl常量的值设置为Perl Hash中的值?

这不起作用:

use constant TEST => $configData{'key'};
print TEST."\n";

这只会打印换行符。

这是对Constant的概念的误用吗?这些值在编译时仍然是已知的,它们只是不存在于perl模块或perl脚本本身内。

3 个答案:

答案 0 :(得分:1)

问题的根源是 - constant用于...常量值,而不是变量。将变量赋值给常量并不是很有意义。

如果你想把它设置为变量值,那么......好吧,真正的答案是不要使用"常数"首先是为了那个。它是在脚本中设置硬编码参数的地方,而不是您稍后需要评估的内容。

您正在做的事情是拥有一个静态的“静态”。配置您加载一次并重复使用。我可以建议您考虑一个对象吗?

#!/usr/bin/perl
use strict;
use warnings;

package MyConfig;

sub new {
   my ( $class ) = @_; 
   my $self = {}; 

   #do some stuff to read 'config' from your file into `$self`. 
   $self->{'key'} = "some value here";
   bless $self, $class;
   return $self; 
}

sub get_test { 
   my ( $self ) =  @_;
   return $self -> {'key'}
}

package main;

my $config = MyConfig -> new();
print $config -> get_test;
通过这种方式 - 通过宣布一个对象 - 你明确表示人们不应该干涉'用它。 (他们在技术上可以,但任何需要戳的人)。

因为你有一个方法(内置在对象中的子程序),叫做“get_test”#39; - 但是没有什么可以让你更改对象 - 然后......你会得到一个非常相似的结果。

这种方法也非常适合加载外部数据' - 因为任何人使用您的外部数据都可以从您的模块中导入它,而不必担心隐藏在其中的内容。

答案 1 :(得分:1)

这是使用Readonly模块的工作示例。我把sub直接放在测试脚本中,但它可能是外部的。

#!/usr/bin/perl

use strict;
use warnings;
use Readonly;
use Data::Dumper;

Readonly::Hash my %configData => loadConfigHash();

sub loadConfigHash {
    my %hash = (one => 1,
                two => 2,
                three => 3);
    return %hash;
}

print Dumper \%configData;

# this assignment will fail and generate a fatal error
$configData{two} = 4;
print Dumper \%configData;

答案 2 :(得分:1)

use constant在编译时发生,无论它出现在源代码中的什么位置。

它类似于将提供的值封装在具有空原型的子例程中。

我感觉您没有使用strict$configData{'key'};语句执行时use constant不存在。

我实际上建议使用Const::Fast,它提供各种可插入的快速常量。

但是,您可以通过将$configData{'key'};use constant的定义包含在与以下相同的BEGIN块中来解决您的问题:

#!/usr/bin/env perl

use strict;
use warnings;

my %configData;

BEGIN {
    $configData{'key'} = 'value';
}

use constant TEST => $configData{'key'};

print TEST, "\n";

如果您尝试在运行时执行此操作,则必须使用空原型预先声明TEST

#!/usr/bin/env perl

use strict;
use warnings;

sub TEST();

my %configData;

$configData{'key'} = 'value';

require constant;
constant->import(TEST => $configData{'key'});

print TEST, "\n";

最好使用Const::Fast