Это регулярное выражение ниже лучше подходит для устранения повторяющихся последовательностей пути.
qr{ (
[\\/] # 1. starts with a path break
.+? # 2. whatever
)
\1 # whatever was captured in the previous group
# it forces us to backtrack on #2 until we have duplicates
# it will necessarily have a path break at the beginning
}x;
Регулярное выражение, предоставленное Дейвом Уэббом, работает, пока в пути нет повторяющихся букв . Просто сделайте последний узел 'mmake'
и он сломается.
Я получаю:
original c:\checkout\omega\abc\mainline\omega\abc\mainline\host\mmake
overlap m
new c:\checkout\omega\abc\mainline\omega\abc\mainline\host\make
Вы хотите, чтобы повторение было именами каталогов , а не символами.
Также все, что нужно, - это простая замена. Скорее всего, когда вы видите ^.*
или .*$
в регулярном выражении, это не нужно. И в этом больше нет необходимости.
На самом деле все это можно сделать с помощью:
$path =~ s/([\\\/]+.+?)\1/$1/;
Заменить что-нибудь, и это дублирует что-то.
Кстати, File::Spec
- это общепринятый способ объединения каталогов независимо от платформы:
my $path = File::Spec->catfile( $root, $client, $build );
$path =~ s/([\\\/]+.+?)\1/$1/;
У меня есть небольшая любимая мозоль с File::Spec
. Мне нравится , используя /
для каталогов. И Perl работает с /
в среде Windows. Пока я нахожусь в пределах Perl, мне никогда не придется разделять пути с помощью символа escape (в семействе языков C). File::Spec
заставляет обратную косую черту соответствовать платформе Windows.
Однако, если это то, что вы ищете, это, вероятно, больше причин для его использования.