Alois Mahdal 走在正确的轨道上,但很难解决问题。这是对此事的不同看法。我们可以使用 Devel::Peek 来查看 Perl 在变量中看到的内容。Perl 具有三种与 C 类型相关的基本(非引用)存储类型:字符串是指针(PV),数字可以是浮点数(NV,数值)或整数(IV)。
#!/usr/bin/env perl
use strict;
use warnings;
use Devel::Peek; # Dump
my $x = "1e10";
Dump $x;
输出
SV = PV(0x1204090) at 0x1225b80
REFCNT = 1
FLAGS = (PADMY,POK,pPOK)
PV = 0x1212ac0 "1e10"\0
CUR = 4
LEN = 16
PV 是一个字符串。你可以看到价值。现在我们强制输入一个数字,比如加零。
...
$x += 0;
Dump $x;
屈服
SV = PVNV(0xf018f0) at 0xf21b90
REFCNT = 1
FLAGS = (PADMY,IOK,pIOK)
IV = 10000000000
NV = 10000000000
PV = 0xf0eac0 "1e10"\0
CUR = 4
LEN = 16
现在您可以看到该变量包含原始 PV 和代表 100 亿的数值 (NV)(以及整数值 (IV))。IOK 告诉我们它目前主要被认为是一个整数。它会保留其他值,以防您再次强制。
所以你看,从科学值到数字的强制转换就像从字符串转换为数字一样简单(加零是一种常见的机制)。反过来,请使用sprintf
正确的格式。
注意为了完整起见,我们可以通过添加小数来查看到 NV 的转换。
...
$x += 0.1;
Dump $x;
输出
SV = PVNV(0x1ee0910) at 0x1f00b90
REFCNT = 1
FLAGS = (PADMY,NOK,pNOK)
IV = 0
NV = 10000000000.1
PV = 0x1eedac0 "1e10"\0
CUR = 4
LEN = 16
NOK 告诉 Perl 它现在应该是一个浮点值。