我有一个文件,其数据如下:
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));
但是我看到它说分配给哈希的元素数量为奇数。
答案 0 :(得分: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";
}
这当然可以在文件中运行任何代码,但是只要配置文件不可编辑的任何人都不能写,通常这不是问题。
不允许运行任意代码的配置文件的其他一些选项是JSON和Config::Tiny。
请确保使用./output.pl
而不是output.pl
;如果没有前导./
,do
函数将搜索@INC
(该目录不再包含5.26+中的当前目录),而不仅仅是使用当前目录。
如果要从与当前文件相同的目录而不是从当前工作目录中加载文件(通常是更可靠的解决方案),请参见Dir::Self或Path::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'));