use strict; sub extract { chomp(my $orig = shift); foreach ( split(/,/, $orig) ) { # scan list of tokens if ( / <\*\d+> ([^<]+) < (\d+) : (\d+) > /x ) { # do something with extracted information print "got $1/$2/$3 from '$orig'\n"; } } } extract($_) while (); __DATA__ <*2>H<3:0>,<*2>I<3:0>,...,<*2>Z<2:0> H<3:0>,<*2>I<3:0>,...,<*2>Z<2:0>