#!/usr/bin/perl use warnings; use strict; my @sets = []; while (my $line = ) { if ($line =~ /\[([0-9]+)\.\.([0-9]+)\]/) { my ($from, $to) = ($1, $2); $line = [$from .. $to]; } else { chomp $line; $line = [$line]; } @sets = map { my @prev = @$_; map [ @prev, $_ ], @$line } @sets; } use Data::Dump 'dd'; dd @sets; __DATA__ [0..1] [2..4] 9 [5..8]