Удалить ненужные значения пути к файлу из массива - PullRequest
0 голосов
/ 20 декабря 2011

Я просто не могу удалить значения "ExcludedFolders" из массива "Папки", вот что я имею, любая помощь в благодарности.

КОД:

#!/usr/bin/perl

print "Content-type: text/html\n\n";


my @ExcludedFolders = qw(
/this/is/folder/path/one/exclude
/this/is/folder/path/three/exclude
/this/is/folder/path/five/exclude
);



my @Folders = qw(
/this/is/folder/path/one/exclude/some/file.dat
/this/is/folder/path/two/exclude/some/file.dat
/this/is/folder/path/three/exclud/some/file.dat
/this/is/folder/path/four/excludee/some/file.dat
/this/is/folder/path/five/exclude/some/file.dat
/this/is/folder/path/six/exclude/some/file.dat
);



my %remove;

@remove{@ExcludedFolders}=();
@Folders=grep{!exists$remove{$_}}@Folders;


foreach my $Path (@Folders) {
print "$Path \n";
}

Спасибо

Ответы [ 3 ]

3 голосов
/ 20 декабря 2011

Это не работает, потому что '/this/is/folder/path/one/exclude/some/file.dat' не существует в хеше %remove;'/this/is/folder/path/one/exclude/' делает.

Я бы рекомендовал использовать Tie::RegexpHash здесь:

use strict;
use warnings;
use Tie::RegexpHash;

my $remove = Tie::RegexpHash->new;

my @ExcludedFolders = qw(
    /this/is/folder/path/one/exclude
    /this/is/folder/path/three/exclude
    /this/is/folder/path/five/exclude
);

$remove->add( qr/^$_/ , 1 ) foreach @ExcludedFolders;

my @Folders = qw(
    /this/is/folder/path/one/exclude/some/file.dat
    /this/is/folder/path/two/exclude/some/file.dat
    /this/is/folder/path/three/exclud/some/file.dat
    /this/is/folder/path/four/excludee/some/file.dat
    /this/is/folder/path/five/exclude/some/file.dat
    /this/is/folder/path/six/exclude/some/file.dat
);

@Folders = grep { ! $remove->match_exists( $_ ) } @Folders;
1 голос
/ 20 декабря 2011

Для каждого пути в @Folders необходимо проверить, соответствует ли какой-либо из исключенных путей начальному сегменту. Список :: MoreUtils :: none здесь пригодится, но его можно легко заменить другим grep:

#!/usr/bin/env perl

use strict; use warnings;
use List::MoreUtils qw( none );

my @ExcludedFolders = map qr{^$_}, qw'
    /this/is/folder/path/one/exclude
    /this/is/folder/path/three/exclude
    /this/is/folder/path/five/exclude
';

my @Folders = qw'
    /this/is/folder/path/one/exclude/some/file.dat
    /this/is/folder/path/two/exclude/some/file.dat
    /this/is/folder/path/three/exclud/some/file.dat
    /this/is/folder/path/four/excludee/some/file.dat
    /this/is/folder/path/five/exclude/some/file.dat
    /this/is/folder/path/six/exclude/some/file.dat
';

@Folders = grep {
    my $folder = $_;
    none {
        $folder =~ $_
    } @ExcludedFolders
} @Folders;

use Data::Dumper;
print Dumper \@Folders;

Вывод:

$VAR1 = [
          '/this/is/folder/path/two/exclude/some/file.dat',
          '/this/is/folder/path/three/exclud/some/file.dat',
          '/this/is/folder/path/four/excludee/some/file.dat',
          '/this/is/folder/path/six/exclude/some/file.dat'
        ];
1 голос
/ 20 декабря 2011

Нет перекрытия в двух массивах. @Folders названо неправильно, поскольку это действительно файлы. Я уверен, что есть лучший способ, но я занят:

## build a big regex to match exclude directories against
my $exclude_re = join '|', map { "\A\Q$_\E" } @ExcludedFolders;
my @filtered_files = grep { $_ !~ m{$exclude_re}i } @Folders;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...