'<' в поле ЗАМЕНА Perl - PullRequest
       9

'<' в поле ЗАМЕНА Perl

0 голосов
/ 01 сентября 2018

Почему применяется код perl

 undef $/;  # read in entire file or STDIN
 $_ = <>;
 s|<head>.*<\head>|<head>...</head>|s;

применяется к текстовому файлу, содержащему

 <head>[anything]</head>

продукты

 ...

а не

 <head>...</head>

Когда символы '<' в поле ЗАМЕНА замены отсутствуют, как в </p>

 s|<head>.*</head>|head>.../head>|s;

замена производит

 head>...end>

Символ '<' имеет значение, но я не могу найти объяснения, почему. </p>

Как получить «<» в результате замещения? </p>

Ответы [ 2 ]

0 голосов
/ 01 сентября 2018

Первый фрагмент не производит вывод, который вы утверждаете, что он делает.

$ perl -e'$_ = "<head>foo</head>"; s|<head>.*<\head>|<head>...</head>|s; CORE::say'
<head>foo</head>

Причина, по которой он не выполняет замену, заключается в том, что \h соответствует горизонтальному пробелу.

Вы, вероятно, хотели использовать </head> вместо <\head>. Это дает желаемый результат.

$ perl -e'$_ = "<head>foo</head>"; s|<head>.*</head>|<head>...</head>|s; CORE::say'
<head>...</head>

Ничто, даже похожее на ваш код, не выдаст просто ..., как вы утверждаете. Конечно, если вы просматриваете файл, содержащий <head>...</head> в средстве просмотра HTML, он будет выглядеть как .... Чтобы создать HTML-код, отображаемый как <head>...</head>, вам потребуется выполнить экранирование.

$ perl -e'
   use HTML::Escape qw( escape_html );
   $_ = "<head>foo</head>";
   s|<head>.*</head>|<head>...</head>|s;
   CORE::say(escape_html($_));
'
&lt;head&gt;...&lt;/head&gt;
0 голосов
/ 01 сентября 2018

Если <\head> - ошибка, ваш код делает то, что вы ожидаете. Все, что вы используете для просмотра результата, вероятно, является причиной ваших пропущенных тегов. Вы смотрите на вывод в браузере?

Когда вы удаляете отверстие <, теги больше не выглядят как теги и отображаются вместо действия.

...