如何在从另一个变量值构造的变量中使用哈希值

时间:2014-11-09 23:40:45

标签: perl

我从一个名为flowfx.config.pl的文件中读取了一些配置。 它看起来像这样:

logfile_path     => '/proj/flowfx/ffx/log/',
path       => '/temp/',
skip_files => [ 'png', 'gif', 'jpg' ],

然后我想使用从命令行传入的组件并构造一个变量 它使用配置文件中的路径值。它在一定程度上起作用。您可以更轻松地向您展示代码,并阅读评论以解释哪些有效,哪些无效。

my %flowfx = do 'flowfx.config.pl';

#prints value of '/proj/flowfx/ffx/log/'
print $flowfx{logfile_path};


#my component name which will be passed in on command line. hardcoded for the moment
$component = "flowfx";

下一段代码工作正常。 $ flowfx_log的值为' / proj / flowfx / ffx / log /'并按此印刷。

${$component . "_log"} =   $flowfx{logfile_path};
print ${$component . "_log"};

以下不起作用。我得到错误"在打印中使用未初始化的值" 我希望$ flowfx_log2的值为$ flowfx {logfile_path},这是' / proj / flowfx / ffx / log /'

${$component . "_log2"} =   ${$component."{logfile_path}"};
print ${$component . "_log2"};

我确定它是微不足道的。你能给我一些关于我做错的提示吗?

1 个答案:

答案 0 :(得分:-1)

如何:从@ARGV读取组件。

很可能有更好的方法来获取输入但不使用模块,这似乎有效。

将值放在带键的哈希值中。

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

my $component = $ARGV[0] or die "no input"; #passed in as argument

open my $fh, "flowfx.config.pl";

my %flowfx;

while ( my $line = <$fh> ){
    # read in hash line by line, this assumes no useless input in file

    my ( $key, $value ) = split( /\s*=>\s*/, $line ); # extract key/value

    $value =~ s/\'//g; # remove quotes

    if ( $value =~s /\[/\]/g ){ # make a list
    $value = [ split(",",$value) ];
    }

    $flowfx{$key} = $value; # store the value in hash
}

close $fh; # close filehandle

my $info;

$info->{$component."_log"} = $flowfx{logfile_path};

print $component."_log".": ".$info->{$component."_log"};