Perl - поиск частичных совпадений в строковом массиве и возврат соответствующих индексов
Предположим, у меня есть массив строк @file_paths
который содержит
@file_paths= ["C:\Lazy\FolderA\test.cpp", "C:\Lazy\FolderA\test2.cpp",
"C:\Lazy\FolderB\test.cpp", "C:\Lazy\FolderB\test2.cpp", ... etc]
Я хочу быть в состоянии найти индексы массива, соответствующие позициям FolderA, FolderB, позиции... и так далее.
то есть что-то вроде @file_paths.indices("FolderA")
вернется @indices = [0,1]
а также @file_paths.indices("FolderB")
вернется @indices = [2,3]
.. так далее
Хитрость заключается в том, что я буду делать функцию содержимого для @file_paths, чтобы получить соответствующие индексы. Как будет выглядеть подпрограмма?
2 ответа
Решение
Вот ответ: http://bit.ly/13LE8K0
Вы можете использовать CPAN List:: MoreUtils
use 5.012;
use strict;
use warnings;
use List::MoreUtils qw(indexes);
my @file_paths= qw(
C:\Lazy\FolderA\test.cpp C:\Lazy\FolderA\test2.cpp
C:\Lazy\FolderB\test.cpp C:\Lazy\FolderB\test2.cpp
);
my @ind = indexes {$_ =~ /FolderB/} @file_paths;
say "@ind";
говорит
2 3
my @file_paths= ("C:\\Lazy\\FolderA\\test.cpp", "C:\\Lazy\\FolderA\\test2.cpp",
"C:\\Lazy\\FolderB\\test.cpp", "C:\\Lazy\\FolderB\\test2.cpp");
my @aIndices = indices("FolderA", @file_paths);
sub indices {
my ($keyword, @paths) = @_;
my @results = ();
for ( my $i = 0; $i < @paths; ++$i )
{
if ($paths[$i] =~ /\\$keyword\\/)
{
push @results, $i;
}
}
return @results;
}