Уменьшить списки папок до самой низкой общей папки - PullRequest
0 голосов
/ 27 сентября 2011

У меня есть огромный список путей к файлам, которые слишком велики для обработки нашим SCM.Мне нужно уменьшить их на основе папки самого низкого общего уровня.Например, учитывая следующие пути:

//folder1/folder2/folder2
//folder1/folder2/folder5
//folder1/folder3/folder6
//folderx/foldery/folder9
//folderx/foldery/folder10

Исходя из этого, я хотел бы прийти к следующему:

//folder1/folder2
//folder1/folder3
//folderx/foldery

Список папок будет прочитан из текстового файла, исоставляет около 2 м линии.

Любая помощь будет принята с благодарностью.

Ответы [ 2 ]

1 голос
/ 27 сентября 2011

Это выглядит как хорошее применение для split() и хэшей:

use strict;
use warnings;

my %seen;
foreach my $path ( @paths ) {
  $path =~ s|^//||; # Strip off leading //
  my @elems = split( '/', $path );
  $seen{$elems[0]}{$elems[1]}++;
}

foreach my $rootpath ( sort keys %seen ) {
  foreach my $secondpath ( sort keys %{$seen{$rootpath}} ) {
    print "//" . $rootpath . "/" . $secondpath . "\n";
  }
}

Если вы хотите распечатать только пути, которые были замечены дважды или более, вставьте next if $seen{$rootpath}{$secondpath} > 1; перед print().

Я не проверял это, поэтому могут быть синтаксические ошибки, но код дает общую суть.

0 голосов
/ 03 февраля 2012

Как насчет:

#!/usr/local/bin/perl 
use strict;
use warnings;
use 5.010;

my %out;
while(<DATA>) {
    chomp;
    m#^(//[^/]+/[^/]+)#;
    $out{$1} = 1;
}
say for keys%out;

__DATA__
//folder1/folder2/folder2
//folder1/folder2/folder5
//folder1/folder3/folder6
//folderx/foldery/folder9
//folderx/foldery/folder10

выход:

//folderx/foldery
//folder1/folder3
//folder1/folder2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...