aboutsummaryrefslogtreecommitdiffstats
path: root/lib/Subst/Complex.pm
diff options
context:
space:
mode:
authorArne Georg Gleditsch <argggh@lxr.linpro.no>2007-07-05 00:51:08 +0200
committerArne Georg Gleditsch <argggh@lxr.linpro.no>2007-07-05 00:51:08 +0200
commite9fa4c98bb5f084739d3418ade3f0c51e34a0aa1 (patch)
treefec1d635625e031cde7cba1b0a1d95ee92ac760b /lib/Subst/Complex.pm
Rebase tree.
Diffstat (limited to 'lib/Subst/Complex.pm')
-rw-r--r--lib/Subst/Complex.pm63
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;