的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类似于@+
trick that Axeman shows。我想我有@+
和@-
在第一章掌握Perl一些例子。
随着即将推出的Perl 5.14,还有另一种有趣的方式来做到这一点。 s///
上的/r
标志确实为a non-destructive substitution。也就是说,它绑定的字符串相匹配,但在副本上进行替换,并返回副本:
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
起初傻,但我真的开始喜欢它。很多事情变得非常简单。这与the idiom that M42 shows类似,但它有点棘手,因为旧的习语做了一个赋值,然后是一个替换,其中/r
功能做了替换,然后是一个赋值。你必须小心你的圆括号,以确保正确的顺序发生。
注意在这种情况下,因为版本是Perl 5.12或更高版本you automatically get strictures。
我倾向于不喜欢这一个,因为它区分大小写,只匹配一个空格。这可能不是什么大不了的事情,但HTTP不会限制这些事情。另外,我倾向于使用index()来检查一个子串是否存在,因为我不必关心这个长度。 – 2010-10-14 19:20:06