繁体   English   中英

Perl将常数的值设置为哈希键的值

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM