$` | $& | $’ | $1 | $2 | $n
>>>每一次成功的匹配了一个模式(包括替换),操作符都会把变量 $`|$&|$’分别设置为匹配内容左边的内容,匹配的内容和匹配右边的文本,这个功能对字符串分解为组件很有用。
>>>为了有更好的颗粒度和提高效率,你可以用圆括弧捕捉你特别想分离出来的部分。每对圆括弧捕捉与圆括弧内的模式相匹配的子模式。圆括弧由左圆括弧的位置从左到右依次排序;对应那些子模式的子字串在匹配之后可以通过顺序的变量 $1 ,$2,$3等等获得。
example:
my $str = "*****bange&&&&&mantou%%%%%";
$str =~ /(bange)\S+(mantou)/;
print "$1$2\n"; ### bangemantou
print "<$`>$&<$'>\n"; ### <*****>bange&&&&&mantou<%%%%%>
print "$str\n"; ### *****bange&&&&&mantou%%%%%
注:
>>模式匹配是指一次匹配操作,而不是指一次匹配上的内容,比如上面的,在两个圆括弧中同时匹配上内容,但是他们仅仅属于这一次匹配操作,还有中间的\S+,都是这一次匹配的结果。也就是说//中间的所有匹配上的内容是这一次匹配操作的结果,然后依此分配三个变量的内容。
>>$`, $& , $' 和排序的变量都是全局变量,它们隐含地局部化为属于此闭合的动态范围。它们的存在直到下一次成功的匹配或者当前范围的结尾,以先到者为准。
>>一旦 Perl 认为你的程序的任意部分需要 $` , $& , 或 $',它就会为每次模式匹配提供这些东西。这样做会微微减慢你的程序的速度。Perl 同样还利用类似的机制生成 $1 ,$2 等等,因此你也会为每个包含捕捉圆括弧的模式付出一些代价。