Perl 5.10 имеет приятную особенность, которая позволяет вам получить простоту решений $'
без проблем с производительностью.Вы используете флаг /p
и переменную ${^POSTMATCH}
:
use 5.010;
if( $string =~ m/^User-Agent:\s+/ip ) {
my $agent = ${^POSTMATCH};
say $agent;
}
Хотя есть и другие приемы.Если вы не можете использовать Perl 5.010 или новее, вы используете глобальное совпадение в скалярном контексте, значение pos - это то место, где вы остановились в строке.Вы можете использовать эту позицию в substr :
if( $string =~ m/^User-Agent:\s+/ig ) {
my $agent = substr $string, pos( $string );
print $agent, "\n";
}
pos похож на @+
трюк, который Axeman показывает .Я думаю, у меня есть несколько примеров с @+
и @-
в Мастеринг Perl в первой главе.
С Perl 5.14, который скоро появится, есть еще один интересный способ сделать это,Флаг /r
на s///
делает неразрушающей заменой .То есть он соответствует связанной строке, но выполняет подстановку для копии и возвращает копию:
use 5.013; # for now, but 5.014 when it's released
my $string = 'User-Agent: Firefox';
my $agent = $string =~ s/^User-Agent:\s+//r;
say $agent;
Сначала я думал, что /r
глупо, но я действительно начинаю его любить.Так много всего получается с этим очень легко.Это похоже на идиому, которую M42 показывает , но это немного хитро, потому что старая идиома выполняет назначение, а затем замену, где функция /r
выполняет замену, а затем назначение.Вы должны быть осторожны со своими круглыми скобками, чтобы убедиться, что происходит правильный порядок.
Обратите внимание, в этом случае, поскольку версия Perl 5.12 или более поздняя, вы автоматически получаете ограничения .