似乎将哈希值打印到文件可能会在内部发生变化。
将打印以下代码段(请注意1.6左右有双引号):
{"john":4,"mary":"1.6"}
代码段:
use JSON::XS;
$a = {};
$a->{john} += "4";
$a->{mary} += "1.6";
open ($fd, ">tmp.txt") || die "Failed to open file to write $!\n";
print $fd "$a->{mary}";
close $fd;
$b = encode_json($a);
print "$b\n";
如果我在写入上述文件时注释掉3行:
open ($fd, ">tmp.txt") || die "Failed to open file to write $!\n";
print $fd "$a->{mary}";
close $fd;
它将打印而不会在1.6左右双引号。
{"john":4,"mary":1.6}
我的perl是在Ubuntu 12.04 64bit上运行的5.14.2,JSON :: XS模块的版本是3.01。
不知道是什么导致了这一点。感谢。
答案 0 :(得分:2)
似乎将哈希值打印到文件可能会在内部发生变化。
不,但是将字符串传递给加法运算符会。
$ perl -MDevel::Peek -e'$x="1.2"; Dump($x); 0+$x; Dump($x);' 2>&1 | grep FLAGS
FLAGS = (POK,pPOK)
FLAGS = (NOK,POK,pIOK,pNOK,pPOK)
传递字符串的副本将避免这种情况。
$ perl -MDevel::Peek -e'$x="1.2"; Dump($x); 0+"$x"; Dump($x);' 2>&1 | grep FLAGS
FLAGS = (POK,pPOK)
FLAGS = (POK,pPOK)
答案 1 :(得分:0)
感谢@ThisSuitIsBlackNot和@Paul Roub的链接,我做了一些小改动,以便编码的json字符串没有围绕数字的双引号:
open ($fd, ">tmp.txt") || die "Failed to open file to write $!\n";
$x = $a->{mary};
print $fd $x;
close $fd;
基本上我只是给中间变量分配一个哈希值并打印中间变量。