我有一个像这样的json文件:
"tool_name": {
"command": "$ENV{TOOL_BIN_DIR}/some_file_name",
"args": "some args"
}
我正在使用Perl 5.14中的use:JSON
。并使用decode_json
函数读取文件并将数据转换为perl哈希值。
但是当我从这样的代码中引用这个读取数据时:
my $cmd = "$data->{tool_name}->{command}";
print $cmd;
我得到了
$ENV{TOOL_BIN_DIR}/some_file_name
如何让perl解析此变量的值?
此示例使用环境变量但通常如果我想使用JSON中的变量 - 我该怎么做?
答案 0 :(得分:1)
使用eval
可以防止恶意或意外损坏:您正在执行的字符串可能包含任何可能对您的系统执行任何操作的Perl代码
最好使用String::Interpolate
模块中的interpolate
,它使用Perl自己的插值引擎,在运行时扩展普通的双引号字符串
此程序为环境变量TOOL_BIN_DIR
设置一个值,并展开包含一个美元tool_name
或$
sigil 1}}哈希的@
哈希中的所有值p>
我已使用Data::Dump
显示插值后的数据内容
如果您不知道哪些值可能包含需要扩展的值,您可能希望编写一个递归子例程来处理所有嵌套哈希值和数组的值
use strict;
use warnings 'all';
use JSON 'decode_json';
use String::Interpolate 'interpolate';
use Data::Dump 'dd';
my $data = decode_json <<'__END_JSON__';
{
"tool_name": {
"command": "$ENV{TOOL_BIN_DIR}/some_file_name",
"args": "some args"
}
}
__END_JSON__
$ENV{TOOL_BIN_DIR} = 'tool_dir_test';
for ( values %{ $data->{tool_name} } ) {
$_ = interpolate($_) if /[\$\@]/;
}
dd $data;
{
tool_name => { args => "some args", command => "tool_dir_test/some_file_name" },
}
答案 1 :(得分:-2)
您可以像以下一样使用eval:
my $cmd = '$ENV{HOME}/toto';
print eval('"' . $cmd . '"'), "\n";
但请记住,从安全角度来看,这是非常不安全的。你可能应该避免这样做。