use 5.014; # needs /r modifier for s/// (also uses 5.10+ \K) use warnings; use strict; use Data::Dump qw(pp); my $cl = q(execute test_number_1 -tex -tex_args -sub_args +debug_dir=./ -fizz_boff -sub_args +debug_dir=./ -constraint parity_en,random_en -sub_args '"' ruck=1 '"' -bar -xyzzy -bar- -constraint dual_en -sub_args -cd -sub_args 2596.slow -fizz_boff- -sub_args test -seed 1 -tex_args- -opt 1 -foo -x y -zz 42 -foo- -tag 2 -last 1); print qq{>$cl< \n\n}; my $in = ' '; # indentation for each level of nesting my $rin = qr{ \Q$in\E }xms; # regex for 1 indent level my $clump = qr{ (?: -sub_args \s+ \S+ | \S) .*? (?= \s+ - | \Z) }xms; my $answer; $answer .= s/^-/$in-/gmr . qq{\n} for $cl =~ m{ $clump }xmsg; # ok pp $answer; print "\n\n"; 1 while $answer =~ s{ (^ ($rin+) - [^\n]+) \n \K ((?: ^ \2 - [^\n]+ \n)*?) (?= ^ \1 -) } { $3 =~ s{^}{$in}xmsgr }xmsge; print qq{>>>$answer<<< \n\n};