Что означает модификатор Perl / m = multiline? - PullRequest
3 голосов
/ 01 августа 2011

Что означает модификатор Perl / m из этого примера?

Например, допустим, у меня есть следующая информация в текстовом файле Example.txt.И каждая строка заканчивается символом новой строки с записью данных Данные Разделитель входной записи устанавливается на:

 $/="__Data__";

 Example.txt

 __Data__
 This is test A.\n
 This is test B.\n
 This is test C.\n
 This is test D.\n

Вопрос 1, после изменения разделителя входной записи на Данные , будут ли символы ^ и $ располагаться следующим образом?

  ^__Data__
  This is test A.\n
  This is test B.\n
  This is test C.\n
  This is test D.\n$

Вопрос 2, допустим, я использую модификатор / m, хотя разделитель входных записей по-прежнему установлен на Данные , будут ли символы ^ и $ установлены на следующее?

  ^__Data__$
  ^This is test A.\n$
  ^This is test B.\n$
  ^This is test C.\n$
  ^This is test D.\n$

  if(/__Data__/m)
  {
      print;
  }

Ответы [ 2 ]

9 голосов
/ 01 августа 2011

/$/ не зависит от $/.

без / м,

  • /^/ соответствует началу строки. (/(?-m:^)/ & hArr; /\A/)
  • /$/ соответствует концу строки и перед новой строкой в ​​конце строки. (/(?-m:$)/ & hArr; /\Z/ & hArr; /(?=\n\z)|\z/)

& # x20;

^__Data__\n          "^" denotes where /(?-m:$)/ can match
This is test A.\n    "$" denotes where /(?-m:$)/ can match
This is test B.\n
This is test C.\n
This is test D.$\n$

С / м,

  • /^/ соответствует началу строки и после "\ n". (/(?m:^)/ & hArr; /\A|(?<=\n)/)
  • /$/ соответствует перед новой строкой и в конце строки. (/(?m:$)/ & hArr; /(?=\n)|\z/)

& # x20;

^__Data__$\n           "^" denotes where /(?m:^)/ can match
^This is test A.$\n    "$" denotes where /(?m:$)/ can match
^This is test B.$\n
^This is test C.$\n
^This is test D.$\n$

Меня спросили о

...$\n$

Сначала давайте продемонстрируем:

>perl -E"say qq{abc\n} =~ /abc$/ ? 1 : 0"
1

>perl -E"say qq{abc\n} =~ /abc\n$/ ? 1 : 0"
1

Смысл в том, чтобы /^abc$/ соответствовал "abc\n" и "abc".

>perl -E"say qq{abc\n} =~ /^abc$/ ? 1 : 0"
1

>perl -E"say qq{abc} =~ /^abc$/ ? 1 : 0"
1
1 голос
/ 01 августа 2011

Ваше предположение верно, многострочный ввод символов ^ и $ соответствует началу и концу строки, тогда как без него вы сопоставляете между символами новой строки (и концами строки).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...