use strict;
use warnings;

my @list = (1, 3, 4, 5, 6, 12, 13, 15, 20, 25, 26, 27);

my $prevd = $list[0];
my @result = ([+$list[0]]);
for (my $idx = 1; $idx < @list; ++$idx) {
	my $d = $list[$idx] - $list[$idx - 1];

	if ( $prevd && $prevd != $d ) {
		push @result, [$list[$idx]];
		$prevd = 0;
	}
	else {
		push @{$result[$#result]}, $list[$idx];
		$prevd = $d;
	}
}

@result =
map {
	if ( @$_ > 2 ) {
		my $d = $_->[1] - $_->[0];
		[@$_[0, $#$_], ($d>1)?($d):()];
	}
	else {
		@$_;
	}
} @result;

use Data::Dumper;
print Dumper(\@result);
