Я попытался преобразовать свой код в серию подпрограмм, чтобы сделать его более модульным.Условные операторы в приведенном ниже коде - это то, что я не могу включить в подпрограмму.
next unless ( $sentblock =~ /\[sent. \d+ len. \d+\]: \[.+\]/ ); #1#
( $sentence, $sentencenumber ) = &sentence_sentnum_chptnum($sentblock); #SUBROUTINE
if ( $sentence =~ /\~\s(\d*F*[\.I_]\w+)\s/ ) { #2#
$chapternumber = $1;
$chapternumber =~ tr/./_/;
}
next
unless ( $sentence =~ /\b\Q$search_key\E/i #3#
&& $sentence =~ /\b\Q$addkey0\E/i
&& $sentence =~ /\b\Q$addkey1\E/i );
next
if ( defined($exc0) #4#
&& length($exc0)
&& $sentence =~ /\b\Q$exc0\E\b/i );
next
if ( defined($exc1) #5#
&& length($exc1)
&& $sentence =~ /\b\Q$exc1\E\b/i );
Подпрограмма до сих пор:
sub sentence_sentnum_chptnum {
my $subsentblock = shift;
my ( $subsentence, $subsentencenumber );
return unless ( $subsentblock =~ /\[sent. (\d+) len. \d+\]: \[(.+)\]/ ); #DIDN'T replace the need to put one in the main script
$subsentencenumber = $1;
$subsentence = $2;
$subsentence =~ s/, / /g;
return ( $subsentence, $subsentencenumber );
}
Она работает как есть, но если я попытаюсьпомещая другие условные выражения в: я получаю ошибки, говоря $sentence is uninitialized
позже в коде.Пример: если я пытаюсь включить проверку $addkey
, используя то же условие, но просто меняя next
на return
, я получаю сообщение об ошибке $sentence is uninitialized
в строке: if ( $sentence =~ /\~\s(\d*F*[\.I_]\w+)\s/ ) {
И аналогично, если я ставлю любое изэти условия в подпрограмме.
Главный вопрос: Как я могу:
(1) избавиться от next unless ( $sentblock =~ /\[sent. \d+ len. \d+\]: \[.+\]/ );
(это тоже в подпрограмме)
(2) Включить: if ( $sentence =~ /\~\s(\d*F*[\.I_]\w+)\s/ )
& все 3 next
заявления
(3) Поскольку оно включено, также вернуть $chapternumber
Не затрагивая мой код?
Общий вопрос передового опыта: Если у меня есть переменные, определенные в верхней части моего кода (из HTML-формы), лучше практиковать их локализацию каждый раз в каждой подпрограмме или просто не передавать ничего вподпрограмму, и использовать значение, назначенное в начале кода?(Пример. $search_key
, $addkey
и $exc
)?
Контрольный пример Я создал контрольный пример, однако он довольно длинный, поэтому я его не включал,Если вам это нужно, это очень похоже на: http://perlmonks.org/?node_id=912276 просто найдите, где подпрограмма вступает во владение, и удалите эту часть ... Это сразу после foreach my $sentblock (@parsed)
.
Примечание: контрольный пример не включает addkey
или exc
, и ничто не будет соответствовать номеру главы (поместите '~ 5.5' перед одним предложением, чтобы включить его)
Я пытался проверять возвращенные $sentence
в основной программе.Это устраняет ошибку, но нет совпадений для остальной части программы (т. Е. Конечный результат поисковой системы равен 0).
Спасибо, дайте мне знать, если что-то неясно.