Ну, так как вы связываете массив, я бы просто проверил $lines[$i]
и $lines[$i+1]
(при условии, что адрес +1 существует), и если первый соответствует TITLE, а второй - PERFORMER поменяй их местами. Если, возможно, вам не нужно переносить их, даже если они не последовательные ??
Вот вариант (этот фрагмент будет идти внутри вашего цикла for
, возможно, выше строки проверки REM), если вы знаете, что они будут последовательными:
if ($i < $#lines and $lines[$i] =~ /^TITLE.*?"$/
and $lines[$i+1] =~ /^PERFORMER.*?$/) {
my $tmp = $lines[$i];
$lines[$i] = $lines[$i+1];
$lines[$i+1] = $tmp;
}
Другим вариантом (который будет работать независимо от последовательности и, возможно, более элегантно) будет
use List::MoreUtils qw(first_index);
(вверху, с другими вашими use
утверждениями), а затем выполните (внутри &c
, но вне цикла for
):
my $title_idx = first_index { /^TITLE.*?"$/ } @lines;
my $performer_idx = first_index { /^PERFORMER.*?"$/ } @lines;
if($title_idx >= 0 and $performer_idx >= 0 and $title_idx < $performer_idx)
{
# swap these lines:
($lines[$title_idx],$lines[$performer_idx]) =
($lines[$performer_idx],$lines[$title_idx]);
}
Это то, что вы ищете?