Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl 如何转换';散列字符串';散列?_Perl - Fatal编程技术网

Perl 如何转换';散列字符串';散列?

Perl 如何转换';散列字符串';散列?,perl,Perl,我将散列字符串存储在文件中,{a”=>1,“b”=>2},我打开文件并将此散列字符串存储到$hash\u string,如何将此$hash\u string转换为$hash\u string\u ref={a”=>1,“b”=>2} $ echo '{"a"=>1,"b"=>2}' > val.pl $ perl -le 'my $foo = do "val.pl"; print $foo->{a}' 1 更好的答案:考虑使用更好的数据序列化格式,例如,或甚至JSON.

我将散列字符串存储在文件中,
{a”=>1,“b”=>2}
,我打开文件并将此散列字符串存储到
$hash\u string
,如何将此
$hash\u string
转换为
$hash\u string\u ref={a”=>1,“b”=>2}

$ echo '{"a"=>1,"b"=>2}' > val.pl
$ perl -le 'my $foo = do "val.pl"; print $foo->{a}'
1

更好的答案:考虑使用更好的数据序列化格式,例如,或甚至JSON.

使用

该模块将运行任何perl代码(在沙箱中)并返回结果。包括解码,例如转储到文件的结构

代码示例:

use Safe;     
my $compartment = new Safe;
my $unsafe_code = '{"a"=>1,"b"=>2}';
my $result = $compartment->reval($unsafe_code);
print join(', ', %$result); 

您的数据格式似乎是“任意Perl表达式”,这是一种非常糟糕的数据格式。为什么不使用或更完整的功能

使用JSON::XS qw(encode_JSON decode_JSON);
子存储结构{
我的($qfn,$data)=@;
打开(我的$fh,'>:原始',$qfn)
或者死(“无法创建JSON文件\“$qfn\”:$!\n”);
打印($fh encode_json($data))
或者死(“无法将JSON写入文件\“$qfn\”:$!\n”);
收盘价($fh)
或者死(“无法将JSON写入文件\“$qfn\”:$!\n”);
}
子荷载结构{
我的($qfn)=@;
打开(我的$fh,'>:原始',$qfn)
或者死(“无法创建JSON文件\“$qfn\”:$!\n”);
我的$json;{local$/;$json=;}
返回decode_json($json);
}
我的$data={“a”=>1,“b”=>2};
save_struct('file.json',$data);
...
my$data=load_struct('file.json');

+1获取序列化建议。但是
do
并不是最安全的选择。在本例中,具有与字符串相同的安全问题。“任意Perl表达式”是std dump/dumper for Perl,如果您知道接收方也是Perl,那么这种数据格式通常是一个很好的解决方案。但当然,若您可能期待Perl以外的其他数据接收器,JSON/YAML甚至xml的解码器更为常见。@FtLie,首先,它不是DD输出。DD不会输出那个。@FtLie,然后有人声称一种难以读取且没有解析器的格式是一种好格式。DD是一种调试工具,它甚至不是特别擅长于此。@FtLie,顺便说一句,您答案中的代码不处理DD输出。很抱歉,您连续三次出错。1) Data::Dump将产生一个非常接近的结果,并且问题包含一个简化的示例(Dumper将在前面包含一个$VAR=)。2) 我声称Perl对于Perl很容易阅读,Perl解析Perl也很好,但并不是说Perl data::Dump(er)对任何事情都有好处。3) 你犯了什么错误?这对我来说很好。最后,请帮助回答这个问题(如何解析给定字符串)。顺便说一句,使用Dumper/Safe是CGI::Session中最常见的序列化程序。
use JSON::XS qw( encode_json decode_json );

sub save_struct {
   my ($qfn, $data) = @_;
   open(my $fh, '>:raw', $qfn)
      or die("Can't create JSON file \"$qfn\": $!\n");
   print($fh encode_json($data))
      or die("Can't write JSON to file \"$qfn\": $!\n");
   close($fh)
      or die("Can't write JSON to file \"$qfn\": $!\n");
}

sub load_struct {
   my ($qfn) = @_;
   open(my $fh, '>:raw', $qfn)
      or die("Can't create JSON file \"$qfn\": $!\n");
   my $json; { local $/; $json = <$fh>; }
   return decode_json($json);
}

my $data = {"a"=>1,"b"=>2};
save_struct('file.json', $data);

...

my $data = load_struct('file.json');