燈明ブログ

現状は小池啓仁の応援ブログ

Perlの謎(その7):マッチ演算子の区切り文字

マッチ演算子スカラー変数に格納されている文字列を正規表現を使ってマッチするか判断する演算子です。
通常、区切り文字『/』を使って以下のようになります。

if ($_ =~ m/abc/) {
   print "マッチした! \n"; 
}
else {
   print "マッチしない!\n"; 
}

しかし、以下のようにも書けるのです。

if (m@abc@) {
   print "マッチした! \n"; 
}
else {
   print "マッチしない!\n"; 
}

そう区切り文字は、『/』でなくとも、任意の非英数字(空白文字は除く)でも大丈夫なのです。
またしかし、非英数字でもカッコ系は、開き/閉じのペアでないとなりません。
またまたしかし、以下の3つに関しては、注意が必要です。

  1. 『#』を使う場合は、マッチ演算子との間にスペースを入れないこと(入れるとコメント認識される)。
  2. 『'』を使う場合は、パターン内で変数が展開されなくなる。
  3. 『?』を使う場合は、??演算子になる(1回しかマッチしない)

ただし、区切り文字『/』は、他の非英数字と違い、mを省略できます。

if (/abc/) {
   print "マッチした! \n"; 
}
else {
   print "マッチしない!\n"; 
}

◆サンプル(m.pl)

use strict;
use warnings;

my $s = "abcxxxxabcyyyyabczzzz";
if ($s =~ m/abc/) {
   print "マッチした! \n"; 
}
else {
   print "マッチしない!\n"; 
}
if ($s =~ m@abc@) {
   print "マッチした! \n"; 
}
else {
   print "マッチしない!\n"; 
}
if ($s =~ m<abc>) {
   print "マッチした! \n"; 
}
else {
   print "マッチしない!\n"; 
}

my $a = 0;
while($s =~ m/abc/g) {
   $a++;
}
print $a, "\n";

$a = 0;
while($s =~ m?abc?) {
   $a++;
}
print $a, "\n";

◆実行結果

C:\perltest>perl m.pl
マッチした!
マッチした!
マッチした!
3
1