I agree that a two-step approach (i.e., match for name_a, then delete unwanted params) is best. However, here's an 'advanced' (read: unnecessarily complex) way that doesn't use the  /e modifier:

>perl -wMstrict -le "my @txt = ( '{name_b param_v=\"wh\"}', '{name_a param_x=\"abc\" param_a=\"fsd\" param_y=\"def\"}', '{name_z param_sd=\"zka\" param_s=\"df\"}', '{name_a param_y=\"wtf\" param_z=\"kro\" param_c=\"ptz\" param_ch=\ +"www\"}', '{name_a param_sd=\"zka\" param_y=\"wtf\"}', ); ;; my $not_p_xy = qr{ (?! param_ [xy] \b) }xms; my $not_sp_param = qr{ (?! \s+ $not_p_xy param_ \w+) . }xms; ;; for my $s (@txt) { print qq{'$s'}; $s =~ s( (?: \G (?<! \A) | \A {name_a) $not_sp_param* \K \s+ $not_p_xy \w+ = \" [^^\"]* \" ) ()xmsg; print qq{'$s' \n}; } " '{name_b param_v="wh"}' '{name_b param_v="wh"}' '{name_a param_x="abc" param_a="fsd" param_y="def"}' '{name_a param_x="abc" param_y="def"}' '{name_z param_sd="zka" param_s="df"}' '{name_z param_sd="zka" param_s="df"}' '{name_a param_y="wtf" param_z="kro" param_c="ptz" param_ch="www"}' '{name_a param_y="wtf"}' '{name_a param_sd="zka" param_y="wtf"}' '{name_a param_y="wtf"}'

Updates:

  1. Removed extraneous  (?: ) grouping around  \K expression above. Example output unchanged.
  2. I agree with Re^2: RegExp: pos management in global substitution regarding efficiency, and have further simplified (IMO) to:
    sub xform { my ($string, ) = @_; my $xy = qr{ [xy] }xmso; my $val = qr{ = ' [^']* ' }xmso; my $param_ = qr{ \s+ param_ }xmso; my $param_xy = qr{ $param_ $xy $val }xmso; my $param_any = qr{ $param_ \w+ $val }xmso; $string =~ s{ (?: \G (?<! ^) | ^ \{ name_a) $param_xy*+ \K $param_any } ''xmsg; return $string; }
    Update: Note that I'm using ' (single-quote) instead of " (double-quote) as the parameter value delimiter in my code and testing. This uses 5.10+ regex features. This has withstood everything I have thrown at it (including the multi-line example of the OP!), and I think it's my final answer. (This even qualifies as perhaps not unnecessarily complex!)


In reply to Re: RegExp: pos management in global substitution by AnomalousMonk
in thread RegExp: pos management in global substitution by OlegG

Title:
Use:  <p> text here (a paragraph) </p>
and:  <code> code here </code>
to format your post, it's "PerlMonks-approved HTML":



  • Posts are HTML formatted. Put <p> </p> tags around your paragraphs. Put <code> </code> tags around your code and data!
  • Titles consisting of a single word are discouraged, and in most cases are disallowed outright.
  • Read Where should I post X? if you're not absolutely sure you're posting in the right place.
  • Please read these before you post! —
  • Posts may use any of the Perl Monks Approved HTML tags:
    a, abbr, b, big, blockquote, br, caption, center, col, colgroup, dd, del, details, div, dl, dt, em, font, h1, h2, h3, h4, h5, h6, hr, i, ins, li, ol, p, pre, readmore, small, span, spoiler, strike, strong, sub, summary, sup, table, tbody, td, tfoot, th, thead, tr, tt, u, ul, wbr
  • You may need to use entities for some characters, as follows. (Exception: Within code tags, you can put the characters literally.)
            For:     Use:
    & &amp;
    < &lt;
    > &gt;
    [ &#91;
    ] &#93;
  • Link using PerlMonks shortcuts! What shortcuts can I use for linking?
  • See Writeup Formatting Tips and other pages linked from there for more info.