Regexes - почти наверняка неправильный инструмент здесь. Вы хотите что-то, что связано с перестановками входного списка.
Это сообщение в блоге дает полезный обзор модулей Perl, связанных с перестановками и комбинациями. Звучит для меня как Алгоритм :: Комбинаторика будет хорошим местом для начала. Что-то вроде этого, возможно:
use Algorithm::Combinatorics;
my @input = qw[1 2 3 4 5 6 8 9 10];
my @perms = permutations(\@input);
Затем вам нужно каким-то образом сравнить допустимые перестановки с наборами, которые вы хотите протестировать. Я бы подумал о построении строкового представления множеств (путем объединения их с известным разделителем) и простого сравнения строк.
my @perm_strs = map { join ':' } @perms;
my @test = qw[2 4 3 1 10 5 9 8 6];
my $test_str = join ':', @test;
my $match = 0;
for (@perm_strs) {
if ($test_str eq $_) {
$match = 1;
last;
}
}
Успех совпадения теперь находится в $match
.
Ваша проблема в том, что код вашего класса ATM требует данных, которые задаются как глобальные переменные в самом классе. С точки зрения ООП, это плохая практика, и в вашем конкретном случае код просто не будет работать, поскольку переменные выходят за рамки основного (виртуального врача).
Либо переместите эти переменные в сам класс (что все еще является плохой практикой), либо оставьте их в другом месте, импортируйте матрицу данных при вызове класса и передайте ее каждой отдельной функции.
Наконец, вы создаете экземпляр банка под названием b1 для использования в классе, который не имеет смысла с точки зрения ООП. Измените b1 на self, чтобы вызывать такие функции, как self.function (одна правка заменяет b1.pinpasscheck () на self.pinpasscheck ()).