我从一个名为flowfx.config.pl的文件中读取了一些配置。它看起来像这样:
logfile_path => '/proj/flowfx/ffx/log/',
path => '/temp/',
skip_files => [ 'png', 'gif', 'jpg' ],
然后,我想使用从命令行传入的组件,并构造一个变量其使用来自配置文件的path的值。它在一定程度上起作用。更容易向您展示代码,也更容易阅读注释来解释什么有效,什么无效。
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"};
我确信这是些琐碎的事情。你能告诉我我做错了什么吗?
怎么样:从@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"};