>perl -E"undef(*^T); $^T = 1400000000.123; say $^T;"
1400000000.123
Well, the floating point number is actually stored correctly in Perl's SV structure.
When assigning to a variable with set magic, the value is assigned as normal, then the magic handler is called.
When fetching from a magical variable with get magic, the magic handler is called to replace the value of the variable, then the fetch happens as normal.
This means you see the value assigned to the scalar in the scalar, but that value is meaningless because it gets clobbered when you read from the scalar.
The magic behind $^T is equivalent to the following:
use Variable::Magic qw( cast wizard );
# The C var $^T mirrors is named PL_basetime
# An IV (signed integer) on all systems except OS/2 and VMS.
my $PL_basetime;
cast($^T, wizard(
# Copies into $^T before fetching from it.
get => sub { ${ $_[0] } = $PL_basetime; },
# Copies from $^T after assigning to it.
set => sub { $PL_basetime = ${ $_[0] }; },
));
|