in reply to Replacing left angle bracket with HTML entity when between two backtick characters

Something like this might work:

my $parts = [ split /[^\\]`|^`/, $string ]; my $count = 0; foreach my $part (@$parts) { $count++; next if ($count %2); # only substitute on odd number array items $part =~ s/</&lt;/g; } my $new_string = join '`', @$parts;

Still seems lame, but I guess it works. Any other suggestions?

$PM = "Perl Monk's";
$MCF = "Most Clueless Friar Abbot Bishop Pontiff Deacon Curate Priest";
$nysus = $PM . ' ' . $MCF;
Click here if you love Perl Monks

  • Comment on Re: Replacing left angle bracket with HTML entity when between two backtick characters
  • Download Code

Replies are listed 'Best First'.
Re^2: Replacing left angle bracket with HTML entity when between two backtick characters
by choroba (Cardinal) on Sep 20, 2018 at 09:32 UTC
    You can also process the string character by character, keeping the state (inside/outside backticks) in a flag variable. To handle unclosed backsticks, only replace the characters when you meet the closing quote, so keep a list of positions to replace in an array. Replacements are happening from the right so you don't have to recalculate the remaining positions after the length of the string changes.
    sub process { my ($string) = @_; my $inside; my $pos = 0; my @replace; while ($pos < length $string) { my $action = { '\\' => sub { ++$pos }, '<' => sub { unshift @replace, $pos if $inside }, '`' => sub { unless ($inside = ! $inside) { substr $string, $_, 1, '&lgt;' for @replace; $pos += 5 * @replace; @replace = (); } }, }->{ substr $string, $pos, 1 }; $action->() if $action; ++$pos } return $string }
    ($q=q:Sq=~/;[c](.)(.)/;chr(-||-|5+lengthSq)`"S|oS2"`map{chr |+ord }map{substrSq`S_+|`|}3E|-|`7**2-3:)=~y+S|`+$1,++print+eval$q,q,a,
Re^2: Replacing left angle bracket with HTML entity when between two backtick characters
by nysus (Parson) on Sep 20, 2018 at 03:19 UTC

    Proposed solution above won't work so well on a string like `this <string> ` that begins and ends with backticks. Edit: I can make the LIMIT argument -1 to get this to work.

    $PM = "Perl Monk's";
    $MCF = "Most Clueless Friar Abbot Bishop Pontiff Deacon Curate Priest";
    $nysus = $PM . ' ' . $MCF;
    Click here if you love Perl Monks