use strict; use warnings; use feature 'say'; display_parts( 0, 9, 10 ); display_parts( 0.022, 0.086, 10 ); display_parts( 0.123, 8.672, 10 ); display_parts( 1_123_345_456, 1_124_246_357.5, 11 ); sub display_parts { my $result = get_ticks(@_); printf "start: %s, end: %s, parts: %s\n", map pretty($_), @_; for ( 0 .. $#$result ) { printf " %2d => %s\n", $_, pretty( $result->[$_] ); } print "\n"; } sub get_ticks { my ( $start, $end, $parts ) = @_; my $tick = ( $end - $start ) / ( $parts - 1 ); my @result; push @result, $start; push @result, $result[-1] + $tick for 1 .. ($parts - 1); return \@result; } sub pretty { return shift =~ s/\d \K (?= (?: \d{3} )+ \b )/_/xgr; }