[英]Perl Setting Value of Constant to value of Hash Key
有什么方法可以将Perl常量的值设置为Perl哈希中的值?
这不起作用:
use constant TEST => $configData{'key'};
print TEST."\n";
这仅打印换行符。
这是对常数概念的滥用吗? 这些值在编译时仍然是已知的,只是它们不存在于perl模块或perl脚本本身中。
问题的根源是- constant
用于...常量值,而不是变量。 将变量分配给常量没有多大意义。
如果您想将其设置为变量值,那么...那么,真正的答案是首先不要使用“常量”。 这是在脚本中设置硬编码参数的地方,而不是您以后需要评估的地方。
看起来您正在执行的操作是拥有一个“ static-ish”配置,该配置可以加载一次并重复使用。 我可以建议您考虑考虑一个对象吗?
#!/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”的方法(内置于对象的子例程),但是没有任何方法可以更改对象,因此...您将获得非常相似的结果。
这种方法也适用非常漂亮的“加载外部数据” -因为使用外部数据的任何人都可以从你的模块导入它,而不必对东西里面藏着隐忧。
这是一个使用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;
无论在源代码中它出现在哪里, use constant
都会在编译时发生。
它的工作类似于将提供的值封装在带有空原型的子例程中。
我觉得您没有使用strict和$configData{'key'};
您的use constant
语句执行时不存在。
我实际上建议使用Const :: Fast ,它提供各种可插值的快速常量。
但是,您可以通过包装$configData{'key'};
的定义来解决您的问题$configData{'key'};
并在与以下相同的BEGIN
块中use constant
:
#!/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
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.