/m Perl regex соответствие модификатора по-другому в Windows?

Вы можете использовать групповой подход.

Dim wb_name as String
wb_name = Range("A1").Value & ".****"
Set wb = Workbooks(wb_name)
5
задан brian d foy 18 October 2008 в 16:40
поделиться

3 ответа

Для этих regexes:

m/\015\012/ms
m/\015\012/s

И/m и/s бессмысленны.

  • /s: делает . соответствие \n также. Ваш regex не содержит .
  • /m: делает ^ и $ соответствие рядом со встроенным \n в строке. Ваш regex содержит нет ^ ни $, или их синонимы.

То, что возможно, действительно, если Ваш входной дескриптор (снабжают сокетом?) работает в текстовом режиме, \r (\015) символы будут удалены в Windows.

Так, что сделать? Я предлагаю делать \015 дополнительные символы, и разделенные против

/\015?\012/

Никакая потребность в/m,/s или даже продвижении m//. Это - просто грузовой культ.

12
ответ дан 18 December 2019 в 10:50
поделиться

Нет никакого волшебства \n. Оба \n и \r всегда имейте в виду точно один символ, и на всех основанных на ASCII платформах, который является \cJ и \cM соответственно. (Исключениями являются платформы EBCDIC (по очевидным причинам) и Классик MacOS (где \n и \r оба имеют в виду \cM).)

Волшебство, которое происходит в Windows, состоит в том, что при выполнении ввода-вывода через дескриптор файла, который отмечен как являющийся в текстовом режиме, \r\n переводится в \n после чтения и наоборот после записи. (Кроме того, \cZ взят для значения конца файла – удивление!) Это сделано на слое библиотеки времени выполнения C.

Вы должны binmode Ваш сокет для фиксации этого.

Необходимо также удалить /s и /m модификаторы от Вашего шаблона: так как Вы не используете метасимволы, поведение которых они изменяют (. и ^/$ пара, соответственно), они ничего не делают – грузовой культ.

3
ответ дан 18 December 2019 в 10:50
поделиться

Почему Вы добавляли /m? Вы пытаетесь разделить на строке? Сделать это с /m необходимо использовать также ^ или $ в regex:

my @lines = split /^/m, $big_string;

Однако, если Вы хотите рассматривать большую строку как строки, просто открыть дескриптор файла на ссылке на скаляр:

open my $string_fh, '<', \ $big_string;
while( <$string_fh> ) {
    ... process a line
    }
1
ответ дан 18 December 2019 в 10:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: