在Perl中读取Perl哈希文件

时间:2019-03-27 10:33:02

标签: perl

我有一个文件,其数据如下:

output.pl

{
    "A" => {
        "name" => "chetan",
        "age" => "28",
    },
    "B" => {
        "name" => "vivek",
        "age" => "31",
    },
};

基本上是哈希存储在其他文件中。

如何编写perl程序以将其作为哈希值加载到变量中?

我尝试过这样的事情:

use Data::Dumper;
use File::Slurp;

my %hash = read_file("output.pl");
print Dumper(keys(%hash));

但是我看到它说分配给哈希的元素数量为奇数。

3 个答案:

答案 0 :(得分:2)

我在您的代码中至少看到两个问题:

  1. 您正在尝试将文件的内容分配给哈希(而不是对其进行评估)
  2. 您的文件包含哈希引用,而不是哈希。

这是如何加载和解析文件内容的另一种方法:

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

use Data::Dumper;

# replacement for loading external file - not relevant for solution
my $content;
{
    local $/;
    $content = <DATA>;
}
#print "${content}\n";

my $hash = eval $content;
die "eval error: $@" if $@;
#print "${hash}\n";

print Dumper($hash);

exit 0;

__DATA__
{
    "A" => {
        "name" => "chetan",
        "age" => "28",
    },
    "B" => {
        "name" => "vivek",
        "age" => "31",
    },
};

试运行:

$ perl dummy.pl
$VAR1 = {
          'A' => {
                   'name' => 'chetan',
                   'age' => '28'
                 },
          'B' => {
                   'name' => 'vivek',
                   'age' => '31'
                 }
        };

答案 1 :(得分:1)

您可以使用do function加载此类数据。

use strict;
use warnings;

my $file = './output.pl';
my $data = do $file;
# unfortunately 'do' error checking is very fragile
# there is no way to differentiate certain errors from the file returning false or undef
unless ($data) {
  die "couldn't parse $file: $@" if $@;
  die "couldn't do $file: $!" unless defined $data;
  die "$file did not return data";
}

这当然可以在文件中运行任何代码,但是只要配置文件不可编辑的任何人都不能写,通常这不是问题。

不允许运行任意代码的配置文件的其他一些选项是JSONConfig::Tiny

请确保使用./output.pl而不是output.pl;如果没有前导./do函数将搜索@INC(该目录不再包含5.26+中的当前目录),而不仅仅是使用当前目录。

如果要从与当前文件相同的目录而不是从当前工作目录中加载文件(通常是更可靠的解决方案),请参见Dir::SelfPath::Tiny或类似文件,并带有绝对路径这样就不会搜索@INC

use Dir::Self;
my $file = __DIR__ . '/output.pl';

use Path::Tiny;
my $file = path(__FILE__)->realpath->sibling('output.pl');

答案 2 :(得分:0)

与Slurp相同,在一行中。

use File::Slurp ;

# no easy way to get current Mojolicious config, so this is a hack
my $config  = eval (read_file( '/etc/smsmap/sms_map.conf'));