in reply to Help with parsing command line to make more readable

Close enough?

#!/usr/bin/perl # https://perlmonks.org/?node_id=1220646 use strict; use warnings; $_ = q(execute test_number_1 -tex -tex_args -sub_args +debug_dir=./ -s +ub_args +debug_dir=./ -constraint parity_en,random_en -sub_args '"' r +uck=1 '"' -constraint dual_en -sub_args -cd -sub_args 2596.slow -sub_ +args test -seed 1 -tex_args- -opt 1 -tag 2); print "$_\n\n"; my $answer = ''; $answer .= s/^-/\t-/gmr . "\n" for /\S.*?(?= +-)/g; $answer =~ s/^(\s*)(-\w+)\n\K((?:.*\n)*?)(?=\1\2-\n)/ $3 =~ s#^#\t#gmr + /gem; print $answer;

Outputs:

execute test_number_1 -tex -tex_args -sub_args +debug_dir=./ -sub_args + +debug_dir=./ -constraint parity_en,random_en -sub_args '"' ruck=1 ' +"' -constraint dual_en -sub_args -cd -sub_args 2596.slow -sub_args te +st -seed 1 -tex_args- -opt 1 -tag 2 execute test_number_1 -tex -tex_args -sub_args +debug_dir=./ -sub_args +debug_dir=./ -constraint parity_en,random_en -sub_args '"' ruck=1 '"' -constraint dual_en -sub_args -cd -sub_args 2596.slow -sub_args test -seed 1 -tex_args- -opt 1

Replies are listed 'Best First'.
Re^2: Help with parsing command line to make more readable
by AnomalousMonk (Archbishop) on Aug 19, 2018 at 20:23 UTC
    $answer .= s/^-/\t-/gmr . "\n" for /\S.*?(?= +-)/g;

    This leaves out the  -tag 2 at the very end of the c.l. string. Changing the look-ahead to  (?=(?: +-|$)) fixes this:

    c:\@Work\Perl\monks>perl -wMstrict -le "$_ = q(execute test_number_1 -tex -tex_args -sub_args +debug_dir=./ - +sub_args +debug_dir=./ -constraint parity_en,random_en -sub_args '\"' + ruck=1 '\"' -constraint dual_en -sub_args -cd -sub_args 2596.slow -s +ub_args test -seed 1 -tex_args- -opt 1 -tag 2); ;; print qq{$_ \n}; ;; my $answer = ''; $answer .= s/^-/\t-/gmr . \"\n\" for /\S.*?(?=(?: +-|$))/g; $answer =~ s{^(\s*)(-\w+)\n\K((?:.*\n)*?)(?=\1\2-\n)} { $3 =~ s{^}{\t}gmr }gem; ;; print $answer; " execute test_number_1 -tex -tex_args -sub_args +debug_dir=./ -sub_args + +debug_dir=./ -constraint par ity_en,random_en -sub_args '"' ruck=1 '"' -constraint dual_en -sub_arg +s -cd -sub_args 2596.slow -sub_args test -seed 1 -tex_args- -opt 1 -t +ag 2 execute test_number_1 -tex -tex_args -sub_args +debug_dir=./ -sub_args +debug_dir=./ -constraint parity_en,random_en -sub_args '"' ruck=1 '"' -constraint dual_en -sub_args -cd -sub_args 2596.slow -sub_args test -seed 1 -tex_args- -opt 1 -tag 2
    I still don't like that the  -cd is separated from its preceding  -sub_args argument. Have to think about that...


    Give a man a fish:  <%-{-{-{-<

Re^2: Help with parsing command line to make more readable
by AnomalousMonk (Archbishop) on Aug 19, 2018 at 21:38 UTC

    Ok, this groups  -sub_args -cd together:

    c:\@Work\Perl\monks>perl -wMstrict -le "$_ = q(execute test_number_1 -tex -tex_args -sub_args +debug_dir=./ - +sub_args +debug_dir=./ -constraint parity_en,random_en -sub_args '\"' + ruck=1 '\"' -constraint dual_en -sub_args -cd -sub_args 2596.slow -s +ub_args test -seed 1 -tex_args- -opt 1 -tag 2); ;; print qq{>$_< \n}; ;; # my $sw = qr{ (?: -sub_args \s+ \S+ | \S) .*? }xms; my $chunk = qr{ (?: -sub_args \s+ \S+ | \S) .*? (?= \s+ - | \Z) }xms; my $answer; $answer .= s/^-/\t-/gmr . qq{\n} for /$chunk/g; $answer =~ s{^(\s*)(-\w+)\n\K((?:.*\n)*?)(?=\1\2-\n)} { $3 =~ s{^}{\t}gmr }gem; ;; print qq{>>>$answer<<< \n}; " >execute test_number_1 -tex -tex_args -sub_args +debug_dir=./ -sub_arg +s +debug_dir=./ -constraint parity_en,random_en -sub_args '"' ruck=1 +'"' -constraint dual_en -sub_args -cd -sub_args 2596.slow -sub_args t +est -seed 1 -tex_args- -opt 1 -tag 2< >>>execute test_number_1 -tex -tex_args -sub_args +debug_dir=./ -sub_args +debug_dir=./ -constraint parity_en,random_en -sub_args '"' ruck=1 '"' -constraint dual_en -sub_args -cd -sub_args 2596.slow -sub_args test -seed 1 -tex_args- -opt 1 -tag 2 <<<

    Update: The
        my $sw = qr{ (?: -sub_args \s+ \S+ | \S) .*? }xms;
    statement above is superfluous.


    Give a man a fish:  <%-{-{-{-<