#!/usr/bin/perl # https://perlmonks.org/?node_id=1226189 use strict; use warnings; while( ) { my @queue = $_; while( @queue ) { local $_ = shift @queue; if( / [^|,\n]* (?: , [^|,\n]* )+ /x ) { push @queue, map "$`$_$'", split /,/, $&; } else { print; } } } __DATA__ some text foo | some text BAR | oh , no , commas | some text BAZ | some text QUX some text Oof | some, text, BAR | some , text , BAZ | some text QUX some,text,FOO | some text BAR | one two | some , text , QUX