$line = '|i1234|lABCD|i5678|i90|lBOO'; while($line =~ /\|i([^|]*)|\|l([^|]*)/g) { print("barcode: $1\n") if (defined($1)); print("homeloc: $2\n") if (defined($2)); } __END__ output ====== barcode: 1234 homeloc: ABCD barcode: 5678 barcode: 90 homeloc: BOO #### $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