#!/usr/bin/perl -wl use strict; sub msplit { my ($delim, $str) = @_; my $pat = ''; $pat = "(?>(.*?)$_$pat)?" for reverse @$delim; grep defined, $str =~ /^$pat(.+)/; } print for map "'$_'", msplit [qw(: :: \s+)], "a:b::c d"; __END__ 'a' 'b' 'c' 'd'