use warnings; use strict; use Config; use Math::BigInt; my $regex = do { my $max = eval $Config{nv_overflows_integers_at} or die; my $len1 = length($max) - 1; my $range = substr $max, 0, 1; $range = $range eq "1" ? "1" : "1-$range"; qr{ \A (?: (?!0) [0-9]{1,$len1} | ( [$range] [0-9]{$len1} ) (?(?{ Math::BigInt->new($^N)->bgt($max) })(*F)) ) \z }x }; use Test::More; diag explain $regex; unlike 0, $regex; like 1, $regex; like 3, $regex; unlike "", $regex; unlike "x", $regex; unlike "123y", $regex; unlike -1, $regex; unlike "-9999999999999999999999999999999", $regex; my $x = eval($Config{nv_overflows_integers_at})-1; like "$x", $regex, "max-1 ($x)"; $x++; like "$x", $regex, "max works ($x)"; $x++; unlike "$x", $regex, "max+1 fails ($x)"; $x+=1_000; unlike "$x", $regex; unlike "999999999999999999999999999999999999", $regex; done_testing;