From: Mischa POSLAWSKY Date: Fri, 20 Nov 2009 00:40:14 +0000 (+0100) Subject: fileset: array search X-Git-Tag: v1.00~5 X-Git-Url: http://git.shiar.net/perl/file-rewrite.git/commitdiff_plain/d72f22ff8c2dd2d763a83aeb19eeca6c2162cacc fileset: array search --- diff --git a/lib/File/Rewrite.pm b/lib/File/Rewrite.pm index 784542d..2b05ded 100644 --- a/lib/File/Rewrite.pm +++ b/lib/File/Rewrite.pm @@ -10,15 +10,20 @@ our @EXPORT_OK = qw(fileset); sub fileset { my ($filename, $replace, $search) = @_; - $search = $replace if not defined $search; my $tmpname = "$filename.$$.tmp"; my $changes = 0; + $search = $replace if not defined $search; + + # generate a single regex to emulate smart match + $search = [$search] unless ref $search eq 'ARRAY'; + $search = join('|', map { ref $_ ? $_ : "^\Q$_\E\$" } @$search); + open my $src, '<', $filename; open my $dest, '>', $tmpname; while (readline $src) { chomp; - if ($_ =~ (ref $search ? $search : qr/^\Q$search\E$/)) { + if ($_ =~ /$search/s) { if (ref $replace eq 'ARRAY') { if (@$replace and $_ eq $replace->[0]) { shift @$replace; diff --git a/t/10-fileset.t b/t/10-fileset.t index db1575e..fca87b7 100644 --- a/t/10-fileset.t +++ b/t/10-fileset.t @@ -3,7 +3,7 @@ use strict; use warnings; -use Test::More tests => 16; +use Test::More tests => 20; use Test::NoWarnings; use autodie; @@ -59,7 +59,13 @@ testfileset('keep first', "foo$/bar$/foo$/", ['foo'], 1, "foo$/bar$/") testfileset('add new array', ".$/", [['foo','.'], ''], 2, ".$/foo$/.$/"); testfileset('replace by array', "$/foo$/.$/", [['foo',''], ''], 3, "foo$/.$/foo$/$/"); -testfileset('partial add', "foo$/$/", [['foo','.'], 'foo'], 1, "foo$/$/.$/"); +testfileset('partial add', "foo$/$/", [['foo','.'], 'foo'], 1, "foo$/$/.$/"); -is(remove_tree($target), 14, 'no unexpected files'); +my $SAMPLE2 = "$/foo$/and$/bar$/.$/"; +testfileset('keep pair', $SAMPLE2, [['foo','bar']], 0, "$/foo$/and$/bar$/.$/"); +testfileset('keep order', $SAMPLE2, [['bar','foo']], 2, "$/and$/bar$/.$/foo$/"); +testfileset('replace pair', $SAMPLE2, [['fooo','barr'], ['bar','foo']], 4, "$/and$/.$/fooo$/barr$/"); +testfileset('mixed arrays', $SAMPLE2, [['bar','foo','.'],['ignore',qr/a/]], 3, "$/foo$/bar$/.$/foo$/.$/"); + +is(remove_tree($target), 18, 'no unexpected files');