Правильное форматирование Perl-переключателей в Emacs

Изменить: После прочтения ответов, я считаю, что ответ "не делай этого", поэтому я отметил соответствующий ответ в качестве официального ответа.

Есть ли простой способ заставить emacs отображать операторы переключения perl, такие как страница переключения perldoc.perl.org?

Вот форматирование на perldoc.perl.org:

use Switch;

switch ($val) {
    case 1          { print "number 1" }
    case "a"        { print "string a" }
    case [1..10,42] { print "number in list" }
    case (\@array)  { print "number in list" }
    case /\w+/      { print "pattern" }
    case qr/\w+/    { print "pattern" }
    case (\%hash)   { print "entry in hash" }
    case (\&sub)    { print "arg to subroutine" }
    else            { print "previous case not true" }
}

Вот форматирование в cperl-mode после M-x indent-region запускается по фрагменту:

use Switch;

switch ($val) {
  case 1                { print "number 1" }
    case "a"    { print "string a" }
      case [1..10,42]   { print "number in list" }
        case (\@array)  { print "number in list" }
  case /\w+/    { print "pattern" }
        case qr/\w+/    { print "pattern" }
        case (\%hash)   { print "entry in hash" }
        case (\&sub)    { print "arg to subroutine" }
        else            { print "previous case not true" }
    }

У меня необъяснимое желание придерживаться конструкций if-elsif...

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

3 ответа

Решение

Извините, я не могу помочь вам с Emacs. Тем не менее, я рекомендую вам придерживаться

if ( condition ) {

}
elsif( other_condition ) {

}
else {

}

а не использовать страшный Switch.pm, Смотрите сообщение Николаса Кларка perl5.porters:

В следующем основном выпуске Switch будет удален из дистрибутива ядра Perl.

Больше обсуждения на PerlMonks.

Как отмечает Рэндал Шварц в комментарии ниже, начиная с версии 5.10, Perl имеет мощную замену, которая не зависит от исходных фильтров:

use feature "switch";

given($_) {
   when (/^abc/) { $abc = 1; }
   when (/^def/) { $def = 1; }
   when (/^xyz/) { $xyz = 1; }
   default { $nothing = 1; }
}

Если cperl не форматирует его правильно, попробуйте perltidy.

Вот изящная функция для запуска perltidy в Emacs для текущего региона:

;; Slick функции для запуска Perltidy на месте
(defun perltidy-region ()
  "Запустите perltidy для текущего региона".
  (Интерактивный)
  (Копи-экскурсия
    (командная оболочка на регион (точка) (пометка) "perltidy -q" nil t)))

Рассматривали ли вы использование таблицы рассылки, как обрисовал Марк Джейсон Доминус в Perl высшего порядка?

Другие вопросы по тегам