有没有办法将Perl常量的值设置为Perl Hash中的值?
这不起作用:
use constant TEST => $configData{'key'};
print TEST."\n";
这只会打印换行符。
这是对Constant的概念的误用吗?这些值在编译时仍然是已知的,它们只是不存在于perl模块或perl脚本本身内。
答案 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
。