Кажется, что у двух типов строк фиксированный компонент спереди, а в именах пользователей не должно быть пробелов. Вы можете использовать эти две вещи для создания шаблона и использования подстановки.
my $str = "User john.hughes logged in from 127.0.0.1";
$str =~ s/(?<=User\s)(\S+)\s//;
print "$1, $str";
В нем используется более продвинутая функция регулярного выражения, называемая положительный взгляд позади . По существу, должен быть шаблон User
(с пробелом, который я представлял пробелом \s
, поскольку его легче читать, чем случайный пробел в вашем паттерне), прежде чем что-либо будет сопоставлено. У имени пользователя нет пробелов, поэтому мы можем захватить как можно больше пробельных символов \S+
после этого. И за ним следует пробел.
Затем мы заменяем это ничем. Хорошая вещь о lookbehind - то, что это не часть шаблона, который будет заменен. Таким образом, результатом подстановки будет то, что имя пользователя и непосредственно следующий за ним пробельный символ будут удалены из строки. Поскольку существует одна группа захвата ()
, имя пользователя будет go в $1
.