Это было перенесено в тестовый набор здесь .
RE-Совершено:
Я хочу вернуть массивы (должны быть ссылками) из 2 подпрограмм, однако регулярное выражение, используемое как условный оператор, не работает, как я надеялся. Я пытался сделать это с одним, но я думаю, что это будет проще.
Чтобы было ясно, моя цель состоит в том, чтобы отсортировать массив совпадений (@all_matches
), а затем добавить другой массив (@all_pronoun_matches
), отсортированный таким же образом, но добавленный на end .
Это подпрограмма @pronoun_matches
:
my ($line, $verbform, $chapternumber, $sentencenumber, $sentence) = @_;
my @matches;
my @pronoun_matches;
return unless ($line =~ /(\w+)\((\w+)\-\d+\,\s(\w+)\-\d+\)/); #2nd repeat check
$grammar_relation = $1;
$argument1 = $2;
$argument2 = $3;
return if (($argument1 =~ /^$argument2/i)||($argument2 =~ /^$argument1/i));
foreach my $pronoun (@stopListNoun)
{
if ((lc $pronoun eq lc $argument1) || (lc $pronoun eq lc $argument2))
{
push (@pronoun_matches, $chapternumber, $sentencenumber, $sentence, $grammar_relation, $argument2, $argument1) if ($argument2 =~ /$verbform/i);
push (@pronoun_matches, $chapternumber, $sentencenumber, $sentence, $grammar_relation, $argument1, $argument2) if ($argument1 =~ /$verbform/i);
}
else
{return}
}
return (\@pronoun_matches);
В @matches
есть очень похожая подпрограмма, кроме этой:
foreach my $pronoun (@stopListNoun) #Just a list of words
{
return if ((lc $pronoun eq lc $argument1) || (lc $pronoun eq lc $argument2));
}
push (@matches, $chapternumber, $sentencenumber, $sentence, $grammar_relation, $argument2, $argument1) if ($argument2 =~ /$verbform/i); ##USED TO BE 'eq', but that prevented protective from showing
push (@matches, $chapternumber, $sentencenumber, $sentence, $grammar_relation, $argument1, $argument2) if ($argument1 =~ /$verbform/i);
return \@matches;
Это называется:
my $matches;
my $pronoun_matches;
$matches = &dependency_checks($lines[$l], $verbform, $chapternumber, $sentencenumber, $sentence);
$pronoun_matches = &pronoun_dependency_checks($lines[$l], $verbform, $chapternumber, $sentencenumber, $sentence);
push @all_matches, $matches if ($matches);
push @all_pronoun_matches, $pronoun_matches if ($pronoun_matches);
Чтобы отправить в секцию печати после сортировки с использованием хэшей, я хотел бы использовать:
@all_matches = (@all_matches, @all_pronoun_matches);
Однако @all_pronoun_matches
имеет 0 совпадений (или они где-то фильтруются).
Вопрос
Почему в @all_pronoun_matches
есть неинициализированные значения ??
После некоторого тестирования я обнаружил, что совпадение никогда не проходит условный оператор, но он такой же, как в подпрограмме @matches
!
Изначально я просто хотел удалить местоимения, и они работали нормально, поэтому я знаю, что условие работает:
foreach my $pronoun (@stopListNoun)
{
return if ((lc $pronoun eq lc $argument1) || (lc $pronoun eq lc $argument2));
}
Я пытался использовать if-else в foreach и комбинировать подпрограммы, но затем все совпадения (включая местоимения) перешли в @all_matches
, несмотря на то, что он вызывался правильно (этот метод был опубликован здесь ранее).
Дайте мне знать, если что-то неясно с моим намерением или проблемой.