$line = '|i1234|lABCD|i5678|i90|lBOO'; for ($line) { /\G \|i ([^|]*) /gcx && do { print "barcode: $1\n"; redo; }; /\G \|l ([^|]*) /gcx && do { print "homeloc: $1\n"; redo; }; /\G \|[^il] [^|]* /gcx && do { redo; }; # skip bad stuff } __END__ output ====== barcode: 1234 homeloc: ABCD barcode: 5678 barcode: 90 homeloc: BOO