Убедить Перлтиди оставить пустое пространство в покое - PullRequest
4 голосов
/ 02 ноября 2011

Я использую Perltidy , чтобы переформатировать несколько моих старых файлов Perl в стиль, который ближе к моим текущим предпочтениям. Я столкнулся с проблемой в этом фрагменте:

Fcntl::S_IRUSR & $mode

Perltidy настаивает на удалении пробела после & токена, в результате чего получается:

Fcntl::S_IRUSR &$mode

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

Я использую Perltidy 20101217, который, очевидно, является последней версией.

EDIT:

Несколько дополнительных замечаний:

  • Использование опции --indent-only (-io) не удаляет вышеупомянутое пространство.

  • Эта проблема не распространяется на следующий эквивалентный фрагмент:

    $mode & Fcntl::S_IRUSR
    

РЕДАКТИРОВАТЬ 2:

В итоге я изменил порядок аргументов оператора &, так как это, похоже, пока работает с проблемой Perltidy. Кроме того, этот подход не требует добавления дополнительных скобок или каких-либо других токенов, которые могут помочь Perltidy делать правильные вещи, но определенно запутают me в долгосрочной перспективе .

UPDATE:

Я связался со Стивом Хэнкоком, автором Perltidy, по этому вопросу. Из его ответа:

Я проверил, и проблема в том, что & ошибается в этом регистр как сигил вызова функции. Основная проблема заключается в том, что perltidy не видит прототипы для других модулей, даже встроенных, поэтому он должен угадайте, когда речь заходит о чем-то вроде "Fcntl :: S_IRUSR". В других словами, он не знает, является ли это вызовом функции или константой, и должен угадать. Когда вы отменили заказ, он убрал неоднозначность &.

Спасибо за примечание. Я посмотрю, смогу ли я придумать патч, чтобы исправить это.

1 Ответ

5 голосов
/ 02 ноября 2011

Это, безусловно, неправильно думает

Fcntl::S_IRUSR & $mode

означает

Fcntl::S_IRUSR(&$mode)

Вы, вероятно, можете обмануть его, используя

(Fcntl::S_IRUSR) & $mode

или

Fcntl::S_IRUSR() & $mode
...