Правильное форматирование Perl-переключателей в Emacs - PullRequest
3 голосов
/ 29 октября 2009

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

Есть ли простой способ заставить 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 ]

4 голосов
/ 29 октября 2009

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

if ( condition ) {

}
elsif( other_condition ) {

}
else {

}

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

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

Подробнее о PerlMonks .

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

use feature "switch";

given($_) {
   when (/^abc/) { $abc = 1; }
   when (/^def/) { $def = 1; }
   when (/^xyz/) { $xyz = 1; }
   default { $nothing = 1; }
}
0 голосов
/ 08 января 2010

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

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

;; Slick functions to run perltidy in place
(defun perltidy-region ()
  "Run perltidy on the current region."
  (interactive)
  (save-excursion
    (shell-command-on-region (point) (mark) "perltidy -q" nil t)))
0 голосов
/ 29 октября 2009

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

...