Perl 変数に格納される内容とその使用方法には違いがあります。1 を掛けると、変数が強制的に数値として使用されることは間違いありません。またSV
、インタープリターに対して変数を表すデータ構造に数値が格納されます。このモジュールを使用して、Devel::Peek
Perl が各変数に格納したものを確認できます。
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
ように扱います。
ほとんどの場合、文字列を数値として使用することを明示的に強制する必要はありません。これは、演算子と関数が文字列を最も適切な形式で使用できるためです。たとえば、==
and!=
演算子は、オペランドを数値形式に変換して数値比較を行います。eq
orを代わりに使用ne
すると、文字列比較が強制されます。use warnings
数値以外の文字列を比較しようとすると、次の==
警告が表示されるため、これは Perl スクリプトで常に使用するもう 1 つの理由です。
Argument "asdf" isn't numeric in numeric eq (==) at -e line 1.