的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