有没有办法测试标量是否已被字符串化?

Yob*_*ert 5 perl

我正在编写一个从perl结构输出类似于JSON的东西的东西.我希望引用的行为如下:

"string" outputs "string"
"05" outputs "05"
"5" outputs "5"
5 outputs 5
05 outputs 5, or 05 would be acceptable
Run Code Online (Sandbox Code Playgroud)

JSON :: XS通过测试标量是否已经"字符串化"来处理这个问题,我觉得这很酷.但是我没有办法在没有编写XS的情况下自己做这个测试,我宁愿避免.这可能吗?我没有在CPAN的任何地方找到这个,没有找到关于Scalar :: Util :: looks_like_number等的大量迂回,这完全不是我想要的.我能找到的唯一权宜之处是Devel :: Peek,感觉很邪恶.而且,就像JSON :: XS一样,我对这个场景很好:

my $a = 5;
print $a."\n";
# now $a outputs "5" instead of 5)
Run Code Online (Sandbox Code Playgroud)

mob*_*mob 5

检查输出B::svref_2object:

use B;
($x, $y, $z) = ("5", 5, 5.0);

print ref(B::svref_2object( \$x )), "\n";
print ref(B::svref_2object( \$y )), "\n";
print ref(B::svref_2object( \$z )), "\n";
Run Code Online (Sandbox Code Playgroud)

输出:

B::PV
B::IV
B::NV
Run Code Online (Sandbox Code Playgroud)

或者,正如池上建议的那样,如果您更愿意查找pPOK旗帜:

if (B::svref_2object( \$x )->FLAGS & B::SVp_POK) {
    print "I guess \$x is stringy\n";
}
Run Code Online (Sandbox Code Playgroud)