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;
}
Другие вопросы по тегам