diff options
Diffstat (limited to 'lib/Subst')
-rw-r--r-- | lib/Subst/Complex.pm | 63 |
1 files changed, 63 insertions, 0 deletions
diff --git a/lib/Subst/Complex.pm b/lib/Subst/Complex.pm new file mode 100644 index 0000000..788d469 --- /dev/null +++ b/lib/Subst/Complex.pm @@ -0,0 +1,63 @@ +package Subst::Complex; + +use strict; + +sub new { + my ($self, @args) = @_; + + my (@re, @ac); + my $l = 1; + while (@args) { + my ($r, $a) = splice(@args, 0, 2); + "" =~ /|$r/; + + push(@ac, [$l+1, $l+1+$#+, $a]); + $l += 1+$#+; + + push(@re, "($r)"); + } + + return bless {'re' => '((?s:.*?))(?:'.join('|', @re).')', + 'ac' => \@ac}, $self; +} + +sub s { + my $self; + my $str; + + if (ref($_[0])) { + $self = shift; + $str = shift; + } + else { + $str = shift; + $self = __PACKAGE__->new(@_); + } + + my @res; +# $str =~ s{$$self{'re'}}{ +# push(@res, $1) if length($1); +# my ($a) = grep { defined $-[$$_[0]] } @{$$self{'ac'}}; +# my @g = map { substr($str, $-[$_], $+[$_] - $-[$_]); +# } $$a[0]..$$a[1]; +# push(@res, $$a[2]->(@g)); +# ''; +# }ge; + $str =~ s{$$self{'re'}}{ + push(@res, $1) if length($1); + my ($a) = grep { defined $-[$$_[0]] } @{$$self{'ac'}}; + my @g = map { substr($str, $-[$_], $+[$_] - $-[$_]); + } $$a[0]..$$a[1]; + push(@res, [$$a[2], [@g]]); + ''; + }ge; + + push(@res, $str) if length($str); + @res = map { + ref($_) ? $$_[0]->(@{$$_[1]}) : $_ + } @res; + + return @res; +} + +1; |