は、Perl変数にが格納され、それがどのようにが使用されているかの違いがあります。あなたは、1を掛けることによって、変数がになり、を数値に強制することが正しいです。また、数字は、インタプリタへの変数を表すSV
データ構造体に格納されます。あなたはPerlが各変数に格納しているものを見るためにDevel::Peek
モジュールを使用することができます。
use Devel::Peek;
my $num = "8.5";
Dump $num;
出力:継続
SV = PV(0xa0a46d8) at 0xa0c3f08
REFCNT = 1
FLAGS = (POK,pPOK)
PV = 0xa0be8c8 "8.5"\0
CUR = 3
LEN = 4
...
my $newnum = $num * 1;
Dump $num;
Dump $newnum;
出力:我々はと懸念している
SV = PVNV(0xa0a46d8) at 0xa0c3f08
REFCNT = 1
FLAGS = (PADMY,NOK,POK,pIOK,pNOK,pPOK)
IV = 8
NV = 8.5
PV = 0xa0be8c8 "8.5"\0
CUR = 3
LEN = 4
SV = NV(0x9523660) at 0x950df20
REFCNT = 1
FLAGS = (PADMY,NOK,pNOK)
NV = 8.5
PV
属性(文字列ポインタ)、NV
(浮動小数点数)、及びIV
(整数)です。最初は$num
には文字列値しかありませんが、数値として使用すると(たとえば乗算で)、数値が格納されます。しかし、$num
はまだそれが文字列であることを "覚えている"ので、Data::Dumper
はそのように扱います。
ほとんどの目的のために、は明示的にの演算子と関数が最も適切な形式でそれらを使用できるので、文字列の使用を強制します。たとえば、==
と!=
演算子は、そのオペランドを数値形式に変換して数値比較を行います。代わりにeq
またはne
を使用すると、文字列の比較が強制されます。
Argument "asdf" isn't numeric in numeric eq (==) at -e line 1.
丸めが発生すると予想される場合、 '$ price * 100 + 0.5'はおそらくあなたが期待したことをしません。 '$ price = 8.5'では方程式の一部が' 850.5 'になります。 – TLP
'perl -e 'printf"%.2f "、8.505''を実行して、間違っていることを確認してください。 – mob
あなたは '$ price'と' $ lsec'をダンプしていますが、それはあなたが比較している数字ではありません。 –