Я предполагаю, что только счетчик отличается между строками
use warnings;
use strict;
use feature 'say';
my ($fn1, $fn2) = ('segment8_400_av.ts', 'segment12_400_av.ts');
# Collect all numbers from all strings
my @nums = map { [ /([0-9]+)/g ] } ($fn1, $fn2);
my ($n, $pos); # which number in the string, at what position
# Find which differ
NUMS:
for my $j (1..$#nums) { # strings
for my $i (0..$#{$nums[0]}) { # numbers in a string
if ($nums[$j]->[$i] != $nums[0]->[$i]) { # it is i-th number
$n = $i;
$fn1 =~ /($nums[0]->[$i])/g; # to find position
$pos = $-[$i];
say "It is $i-th number in a string. Position: $pos";
last NUMS;
}
}
}
Мы зациклились на массиве с номерами массивов, найденными в каждой строке, и на элементах каждого массива (например, [8, 400]
). Каждое число в строке (0-е или 1-е или ...) сравнивается с его аналогом в 0-й строке (элемент массива); все остальные числа одинаковы.
Интересующий номер - тот, который отличается, и мы записываем, какое число в строке это ($n
-й).
Затем ее положение в строке определяется путем ее повторного сопоставления и использования @-
регулярного выражения с (только что установленным) индексом $n
, поэтому смещение начала n-го матч. Эта часть может быть ненужной; Хотя редактирование вопросов помогло, я все еще не уверен, может ли эта позиция быть полезной или нет.
Печать с подсчетом позиции от 0
It is 0-th number in a string. Position: 7
Обратите внимание, что, как только будет обнаружено, что это $i
-ое число, мы не можем использовать index
, чтобы найти его позицию; число ранее в строках может совпадать с $i
-ым в этой строке.
Для проверки измените входные строки, добавив к каждой из них один и тот же номер перед интересующим.
Для обновления вопроса, чтобы изучить последовательность (например, для отсутствующих файлов), с помощью приведенных выше выводов вы можете собрать счетчики для всех строк в массиве с помощью hashrefs (num => filename)
use Data::Dump qw(dd);
my @seq = map { { $num[$_]->[$n] => $fnames[$_] } } 0..$#fnames;
dd \@seq;
, где @fnames
содержит имена файлов (например, два, выбранные для примера выше, $fn1
и $fn2
). Это предполагает, что список файлов был отсортирован для начала или добавлен сортировка, если это не было
my @seq =
sort { (keys %$a)[0] <=> (keys %$b)[0] }
map { { $num[$_]->[$n] => $fnames[$_] } }
0..$#fnames;
Порядок поддерживается массивом.
Добавление этого к приведенному выше примеру (с двумя строками) добавляет к печати
[
{ 8 => "segment8_400_av.ts" },
{ 12 => "segment12_400_av.ts" },
]
При этом все цели в " Edit 2 " должны быть простыми.