Правильное форматирование 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 высшего порядка?