В вашем коде много ошибок, но вы должны начать с добавления
use strict;
use warnings;
в начале программы.Вам придется объявить все свои переменные, но сам Perl поможет вам решить большинство тривиальных задач.
$matches = (@pattern[0-2]);
- это то же самое, что и
$matches = $pattern[-2];
, который обращается ко второму элементу изконец массива - 'free (') - и присваивает его $ match, а это не то, что вам нужно. Вы можете использовать оператор pipe, который соответствует любому из выбранных шаблонов, если вы напишите
$matches = join '|', @pattern;
Кроме того, в
print join("line $counter\t\n",@pattern),"\n" if ($_ =~ /$matches/o);
я не думаю, что join
делает то, что вы думаете. Вы объединяете все элементы массива с первой строкой в качестве разделителя. Если вы просто хотите соответствующую строкутогда вам нужно
print "line $counter\t$_\n" if /$matches/o;
Это должно заставить вас работать, но, как я уже сказал, ваша программа не идеальна, и я показал минимальные необходимые изменения.