Прежде всего, если вы пытаетесь сохранить память на этом уровне, Perl, вероятно, не инструмент для вас. Perl бессмысленно «тратит» память, когда обеспечивает выигрыш в скорости.
$ perl -e'
use feature qw( say );
use Devel::Size qw( size );
sub f {
my $x;
say size($x);
$x = "x" x 100;
say size($x);
}
f() for 1..2;
'
24
134
134
134
И 0+$scalar
, и int($scalar)
возвращают скаляр типа SVt_IV
или SVt_NV
. Любой из них подойдет.
$ perl -e'
use feature qw( say );
use Devel::Size qw( size );
my $x = 1234567890;
my $y = "1234567890";
say size($x);
say size($y);
say size($0+$y);
say size(int($y));
'
24
44
24
24
Невозможно понизить версию существующего скаляра, но вы можете заменить его с помощью «псевдонимов».
$ perl -e'
use feature qw( say );
use experimental qw( refaliasing );
use Devel::Size qw( size );
my $x = 1234567890;
my $y = "1234567890";
say size($x);
say size($y);
\$y = \(0+$y);
say size($y);
'
24
44
24