while ( my $line = ){ my( @a, @b ); my ( $junk, $useful ) = split /\;/, $line; my @elements = $useful =~ m/ (\d+ # some numbers (?: # followed by (don't capture) \(.*?\) # other stuff (non-greedy) in parens )? # (optionally) ) # end capture /smxg; for my $element ( @elements ){ if ( $element =~ /\(.*\)/ ){ push @b, $element; } else{ push @a, $element; } } # do something with @a and @b } __DATA__ 2302.1;2302, 2304(3-8, 92-99), 2305(2, 4-9) 231.1;2301, 2303, 2304(1, 2, 90, 91), 2305(1, 3), 2306, 2307, 2308