gpt4 book ai didi

json - Perl:如果启动线程,JSON 会失败

转载 作者:行者123 更新时间:2023-12-03 22:17:28 26 4
gpt4 key购买 nike

如果某个线程启动,有人可以告诉我为什么 JSON 不起作用吗?

use strict;
use warnings;
use JSON;
use threads;
use threads::shared;

sub th { }

threads->create(\&th)->join() if $ARGV[0];

my $json = to_json({ val => "123"}); # WTF?!?
print "$json\n";

工作正常并打印 JSON 字符串。但通 1作为创建线程的脚本的参数和 to_json会失败
hash- or arrayref expected (not a simple scalar, use allow_nonref to allow this)

如果我使用 encode_json insead,效果相同。
在 JSON 的联机帮助页上不存在线程这个词,我认为没有理由认为线程应该损害外部字符串转换。

???

最佳答案

JSON(.pm) 只是 JSON::PP、JSON::XS 或 Cpanel::JSON::XS 的前端。
您在 JSON::XS 中发现了一个错误。关于这一点,JSON::XS 的文档说:

(I-)THREADS

This module is not guaranteed to be ithread (or MULTIPLICITY-) safe and there are no plans to change this. Note that perl's builtin so-called theeads/ithreads are officially deprecated and should not be used.


[请注意,最后一部分是不正确的。官方的立场其实是:线程很难,所以你应该用别的东西来代替。这是非常值得怀疑的,因为替代方案可以说同样困难。]
解决方法:使用其他后端之一(直接或通过 JSON(.pm))。
$ PERL_JSON_BACKEND=JSON::XS 46793885 0
{"val":"123"}

$ PERL_JSON_BACKEND=JSON::XS 46793885 1
hash- or arrayref expected (not a simple scalar, use allow_nonref to allow this) at /home/ikegami/usr/perlbrew/perls/5.26.0t/lib/site_perl/5.26.0/JSON.pm line 170.

$ PERL_JSON_BACKEND=Cpanel::JSON::XS 46793885 1
{"val":"123"}

$ PERL_JSON_BACKEND=JSON::PP 46793885 1
{"val":"123"}
您可以通过在加载 JSON 之前添加以下内容在脚本中控制它:
BEGIN { $ENV{PERL_JSON_BACKEND} = 'Cpanel::JSON::XS' }

关于json - Perl:如果启动线程,JSON 会失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46793885/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com