Первый фрагмент не производит вывод, который вы утверждаете, что он делает.
$ 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($_));
'
<head>...</head>