正規表示式6
2013-08-26 13:58
不過在使用這些暫存變數有一些必須注意的部份,那就是這些變數的生命週期。因為這些變數回被放在記憶體中,直到下次比對成功,要注意,是比對成功。所以如果你的程式是這麼寫的話:
my $content = "Taipei Perl Monger";
$content =~ /(Monger$)/; # $1 現在是 Monger
print $1;
$content = /(perl)/; # 比對失敗
print $1; # 所以還是印出 Monger
當你第一次成功比對之後,Perl會把你所需要的結果放如暫存變數$1中,所以你第一次列印$1時就會看到Perl印出Monger,於是我們繼續進行下 一次的比對,這次我們希望比對perl這個字串,並且把比對要的字串同樣的放入$1之中。可惜我們的字串中,並沒有perl這個字串,而且我們也沒有加上 修飾符號去進行忽略大小寫的比對,因此這次的比對是失敗的,可是Perl並不會先清空暫存變數$1,因此變數的內容還是我們之前所比對成功的結果,也就是 Monger,這從最後印出來的時候就可以看出來了。
比較容易的解決方式就是利用判斷式去根據比對的成功與否決定是否列印,就像這樣:
my $content = "Taipei Perl Monger";
print $1 if ($content =~ /(Monger$)/); # 因為比對成功,所以會印出Monger
print $1 if ($content = /(perl)/); # 這裡就不會印出任何結果了