From: Mischa POSLAWSKY Date: Fri, 20 Nov 2009 15:21:50 +0000 (+0100) Subject: fileset: explicit undef search to match unconditionally X-Git-Tag: v1.00~4 X-Git-Url: http://git.shiar.net/perl/file-rewrite.git/commitdiff_plain/be4cabbf32b3220dfe687065b992ca15cdfbf4c8 fileset: explicit undef search to match unconditionally --- diff --git a/lib/File/Rewrite.pm b/lib/File/Rewrite.pm index 2b05ded..b3bf3d7 100644 --- a/lib/File/Rewrite.pm +++ b/lib/File/Rewrite.pm @@ -13,17 +13,18 @@ sub fileset { my $tmpname = "$filename.$$.tmp"; my $changes = 0; - $search = $replace if not defined $search; + $search = $replace if @_ < 3; # generate a single regex to emulate smart match $search = [$search] unless ref $search eq 'ARRAY'; - $search = join('|', map { ref $_ ? $_ : "^\Q$_\E\$" } @$search); + @$search = grep { defined } @$search; + $search = @$search ? join('|', map { ref $_ ? $_ : "^\Q$_\E\$" } @$search) : undef; open my $src, '<', $filename; open my $dest, '>', $tmpname; while (readline $src) { chomp; - if ($_ =~ /$search/s) { + if (defined $search and $_ =~ /$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 fca87b7..fd8d6d5 100644 --- a/t/10-fileset.t +++ b/t/10-fileset.t @@ -3,7 +3,7 @@ use strict; use warnings; -use Test::More tests => 20; +use Test::More tests => 21; use Test::NoWarnings; use autodie; @@ -51,6 +51,7 @@ testfileset('remove empty', "$/.$/ $/$/", [undef, ''], 2, ".$/ $/"); testfileset('remove regex', $BASICBODY, [undef, qr/^re/], 2); testfileset('remove all', $BASICBODY, [undef, qr/./], 4, ''); +testfileset('add unconditionally', "$/0$/", ['0', undef], 1, "$/0$/0$/"); testfileset('add string', "foo$/", ['bar'], 1, "foo$/bar$/"); testfileset('keep string', "foo$/bar$/", ['foo'], 0, "foo$/bar$/"); testfileset('replace string', "1$/2$/3$/", [4, 1], 2, "2$/3$/4$/"); @@ -67,5 +68,5 @@ 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'); +is(remove_tree($target), 19, 'no unexpected files');