2014-02-19 1 views
1

В Perl можно писать многострочные строковые литералы, используя обычные кавычки или инструкции здесь-doc, но поскольку отступы кода считаются содержимым самой строки, это либо разрушает форматирование окружающего кода, либо требует перед тем, как использовать дополнительную строку. На данный момент я использую следующую подпрограмму для Unindent строкового литерала:Необязательные многострочные строковые литералы

sub unindent { 
    local $_ = shift; 
    $_ =~ s/^\s*$//mg; 
    $_ =~ s/^(\s*>>>\s)//mg; 
    return $_; 
} 

print unindent " 
    >>> #pragma once 
    >>> #include <...> 
    >>> "; 

Но не изобретать колесо, я хотел бы спросить, есть ли уже что-то для этой цели встроенной в Perl или на CPAN?

+4

Не рекомендуется использовать глобальную переменную '' $ _' внутри подпрограммы, когда ее так просто создать лексическую переменную, например. 'my $ str = shift'. – TLP

+2

или 'local $ _ = shift'. – tobyink

+0

@TLP, @tobyink, ops, я забыл, что '$ _' не станет автоматически локальным. Спасибо за ваши исправления! – firegurafiku

ответ

2

После некоторых более погуглить, я нашел несколько пакетов с аналогичными характеристиками и частично решить эту проблему:

Первый вариант требуется множество зависимостей, которые необходимо установить (для простой функции unindent), остальные три предназначены для здесь только для документов. Ни один из этих пакетов, по-видимому, не поддерживает дополнительные маркеры (>>> в вопросе), которые, на мой взгляд, были бы более безопасными, чем простые отступы (из-за проблем смеси таблеток).

+0

Мне очень нравится [Heredoc :: Unindent] (http://jeremyholland.info/show_file.php?file=Unindent.pm), но он работает только для heredocs с точкой с запятой сразу после идентификатора (например, '<< END;') - отрегулируйте его, заменив строки 56 и 70 на '[,; \)] # semicolon (конец оператора) или запятая (конец хэш-значения) или скобка (конструкция substr (<< END, 0, -1) удаляет последнюю новую строку) '. – Ansa211

+0

FWIW: Фильтры источника * сильно * обескуражены производственным кодом. – tjd

1

Это, вероятно, меньше ответа, чем комментарий, но из-за отсутствия комментариев в комментариях я понял, что использование ответа было бы лучше, если бы я получил свою точку зрения. Я считаю, вы ищете способ, чтобы написать что-то вроде

my $str= "Stuff One 
      Stuff Two 
      Stuff Three"; 

, потому что это более удобным для чтения, но фактическая строка должна стать:

my $str= "Stuff OneStuff TwoStuff Three"; 

или

my $str= 
"Stuff One 
Stuff Two 
Stuff Three"; 

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

my $str= "Stuff One". 
     "Stuff Two". 
     "Stuff Three"; 

или

my $str= "Stuff One\n". 
     "Stuff Two\n". 
     "Stuff Three"; 

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

+0

Совершенно очевидно, что оператор '.' также может использоваться для формирования строки mutliline, но при этом каждая строка имеет много визуального шума. Вопрос я имел в виду прежде всего второй случай, о котором вы говорили, с сохранением новых строк, но иногда бывает полезно иметь вариант функции unindent(), которая также удаляет разрывы строк. – firegurafiku

+0

Ну, но вам нужно будет помнить, что делает что-то. И что еще более важно, когда кто-то читает ваш код, на моем пути они сразу знают, как будет выглядеть строка, и что в ней, а что нет. Если вы опускаете кавычки и точки, любой, кто не знаком с тем, как используется строка, некоторое количество строк позже будет довольно запутанным. Для меня строка, которая выглядит так, как она была определена плохо, и где я должен был проверить, как она используется, прервет меня гораздо больше, чем несколько цитат и точек. Не говоря уже о том, что 'unindent()' добавляет больше отдельных символов, чем это делает до четырех строк. – DeVadder

+0

И, наконец, как это добавляет визуальный шум, чем '>>>>'? Почти каждый программист, видел ли они когда-либо Perl или нет, поймет, что делают цитаты и точки. Но все, кроме вас, будут смущены тем, что там делает '>>>>'. – DeVadder

 Смежные вопросы

  • Нет связанных вопросов^_^