Perl regexp A не соответствует началу файла?

#regex #perl

#регулярное выражение #perl

Вопрос:

Я перебираю файл построчно, выбирая строки, начинающиеся со звездочки : * . Мое простое регулярное выражение работает для всех строк, кроме самой первой строки файла.

ЖЕЛАЕМОЕ ПОВЕДЕНИЕ: регулярное выражение должно правильно соответствовать строкам, начинающимся со звездочки.

ФАКТИЧЕСКОЕ ПОВЕДЕНИЕ таково: если звездочка встречается в самой первой строке файла, регулярное выражение не соответствует.

Мои ПОПЫТКИ ОТЛАДКИ включают:

  1. Добавьте пустую строку в начало файла. РЕЗУЛЬТАТ: ранее пропущенная строка, теперь во второй строке файла, правильно сопоставлена регулярным выражением.
  2. Удалите A из regexp, просто сопоставьте со звездочкой. Теперь первая строка файла правильно сопоставляется регулярным выражением.
  3. Попробуйте использовать ^ вместо A . Первая строка файла по-прежнему не соответствует.

МИНИМАЛЬНЫЙ КОД ДЛЯ ВОСПРОИЗВЕДЕНИЯ:

    while (<$input_fh>) {
     chomp;
     $line = $_;
     if ($line =~ /A*/) {
        ...
     }
  }
 

Входной файл состоит из строк текста, которые могут начинаться или не начинаться со звездочки.

Комментарии:

1. Разве ваш файл не содержит спецификацию?

2. Потому что спецификация длиннее одного байта (фактическое количество байтов зависит от кодировки).

3. Когда у вас возникают эти проблемы, проверка строки с помощью Data::Dumper или Devel::Peek может выявить такие проблемы.

4. Data::Dumper with $Data::Dumper::Useqq = 1; — это то, что вы хотите. (Devel::Peek может помочь в отладке модулей XS. Здесь не проблема.)

5. Вы также можете использовать perlstring функцию из основного B модуля, чтобы узнать, что Perl считает вашей строкой. use B "perlstring"; printf "read line: %sn", perlstring $line;

Ответ №1:

/A*/ соответствует началу строки, а затем символу звездочки.

Вам нужно сопоставить любые символы между началом и звездочкой.

Использовать

 /A.*?*/
 

Смотрите доказательство

Объяснение

 --------------------------------------------------------------------------------
  A                       the beginning of the string
--------------------------------------------------------------------------------
  .*?                      any character except n (0 or more times
                           (matching the least amount possible))
--------------------------------------------------------------------------------
  *                       '*'
 

Комментарии:

1. Это не отвечает на вопрос!