Как бороться с ошибками Perl (неопределенными) - PullRequest
0 голосов
/ 23 декабря 2011

Я сталкивался с ошибками в коде Perl, о которых сообщалось в местах, которые не имеют ничего общего с ошибкой. Я исправил одну такую ​​ошибку после нескольких часов удаления и повторного добавления кода построчно, а затем делал несколько проб и ошибок. Две такие ошибки подробно описаны ниже. Мой вопрос: если эти проблемы произойдут в будущем, есть ли способ, чтобы компилятор Perl помог мне исправить это, ИЛИ мне нужно переписать код на каком-то другом языке. (рассматриваю Java).

Моя программа выглядит так:

use switch;
use strict;
use warnings;
...other modules;
sub log{
}
..various sub routines
switch {$val1)
{
  log(..) #first invocation of log
  case ($val2)
...
}

Теперь в под логе, если я сделаю это

{
  $val3  = POSIX::floor($val2/$val4)*$val4;
  $val5="/x/y/$logfilename";
}

Я получаю сообщение о том, что в операторе case есть ошибка. Если я переместить строку $ val5 = "/ x / y / $ logfilename"; ДО $ val3 ошибки нет. ИЛИ если я удалю '/' в $ val5, т.е. $ val5 = "x", ошибки не будет ИЛИ если я скажу $ val5 = qq (/ x / y / $ logfilename); нет ошибки На этот раз я считаю, что мне повезло, что я нашел обходной путь, но это было только после 3 часов борьбы с этим. Есть ли способ, чтобы компилятор Perl сообщал об ошибках точно?

У меня есть еще один аналогичный случай, который я могу сообщить, и могу добавить при необходимости. Запрошенные входы

Ответы [ 2 ]

9 голосов
/ 23 декабря 2011

Игнорируя проблемы с вашим постом, проблема, с которой вы, вероятно, сталкиваетесь, связана с тем, что функциональность switch в perl реализована с помощью фильтра исходного кода. Это в основном означает, что исходный код предварительно обрабатывается для преобразования того, что выглядит как структура регистра переключателя, в допустимый код perl перед компиляцией. Парсер Perl обычно получает номера строк немного неправильно на сложных структурах, но когда задействованы исходные фильтры, все ставки отключены. Это одна из причин того, что Switch устарела в современных версиях Perl.

Решение состоит в том, чтобы прекратить использование switch и либо использовать другие структуры управления Perl, либо использовать версию perl, достаточно новую для поддержки конструкции given/when (5.10+), которая является современной версией Perl switch / case.

3 голосов
/ 23 декабря 2011

ОГРАНИЧЕНИЯ в Switch звучит так, как будто это актуально:

Из-за эвристического характера синтаксического анализа исходного кода Switch.pm наличие регулярных выражений со встроенными символами новой строки, которые указываются с помощью необработанных разделителей /.../ и не имеют модификатора // x, неотличимы от фрагментов кода, начинающихся с оператор деления /. В качестве обходного пути вы должны использовать m /.../ или m? ...? для таких моделей. Также наличие регулярных выражений указано с помощью raw? ...? Разделители могут вызывать загадочные ошибки. Обходной путь должен использовать m? ...? вместо этого.

Модуль переключения - глубокая черная магия. Пожалуйста, не используйте его, если вы не готовы отладить его проблемы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...