Perl - 插入JSON字符串值

时间:2017-03-23 16:42:33

标签: json perl

我有一个像这样的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中的变量 - 我该怎么做?

2 个答案:

答案 0 :(得分:1)

使用eval可以防止恶意或意外损坏:您正在执行的字符串可能包含任何可能对您的系统执行任何操作的Perl代码

最好使用String::Interpolate模块中的interpolate,它使用Perl自己的插值引擎,在运行时扩展普通的双引号字符串

此程序为环境变量TOOL_BIN_DIR设置一个值,并展开包含一个美元tool_name$ sigil @哈希中的所有值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";

但请记住,从安全角度来看,这是非常不安全的。你可能应该避免这样做。