#! perl -slw use strict; sub mySplit { my ($pattern, $expr) = @_; push @$pattern, '$', ''; my ($n, @fields) = (0); push @fields, $1 while $expr =~ /(.*?)$pattern->[$n]/gc, ++$n < @$pattern; return @fields; } my $string = "a:b::c d|e"; my @fields = mySplit [':','::','\s+','\|'], $string; print do{local $"='~'; "@fields";} #" __DATA__ C:\test>218685 a~b~c~d~e