in reply to Re: Regex stored in a scalar
in thread Regex stored in a scalar

Hello atcroft,

The only way I can find to do this is to pull the substitution apart into its component steps and perform these separately:

#! perl use strict; use warnings; my $c = q{asdfghjk}; my @regex = ( { lh => q{(gh)}, rh => q{__$1__}, }, { lh => q{(h_)}, rh => q{_h!$1!}, }, ); print q{Original: }, $c, "\n"; for my $i (0 .. $#regex) { if ($c =~ /$regex[$i]{lh}/) { my $s = $1; my $d = $regex[$i]{rh}; $d =~ s/\$1/$s/; $c =~ s/$regex[$i]{lh}/$d/; } } print q{Final: }, $c, "\n";

Output:

17:37 >perl 1352_SoPW.pl Original: asdfghjk Final: asdf__g_h!h_!_jk 17:39 >

This is far from elegant, and I keep thinking there must be a simpler way involving s///ee — but I haven’t found it.

Anyway, hope that helps,

Athanasius <°(((><contra mundum Iustus alius egestas vitae, eros Piratica,

Replies are listed 'Best First'.
Re^3: Regex stored in a scalar
by AnomalousMonk (Archbishop) on Aug 22, 2015 at 13:55 UTC

    One way to one step per regex:

    c:\@Work\Perl>perl -wMstrict -le "my $c = q{asdfghjk}; print qq{ original: '$c'}; ;; my @regex = ( { lh => q{(gh)}, rh => q{__$1__}, }, { lh => q{(h_)}, rh => q{_h!$1!}, }, ); ;; for my $hr_s (@regex) { $c =~ s[ (?-x)$hr_s->{lh}]{ qq{qq{$hr_s->{rh}}} }xmsgee; print qq{intermediate: '$c'}; } ;; print qq{ final: '$c'}; " original: 'asdfghjk' intermediate: 'asdf__gh__jk' intermediate: 'asdf__g_h!h_!_jk' final: 'asdf__g_h!h_!_jk'
    Since  s///e or  s///ee is string eval, AnonyMonk's warning/advice here still holds. See Re: Evaluating $1 construct in literal replacement expression and associated nodes for more discussion.


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