パターン内での配列の変数展開

正規表現パターンはダブルクオーテーションで囲った文字列と同じように扱われるため、ダブルクオーテーションで囲われた文字列の中に配列の変数を記述した場合と同じくパターン内に配列の変数を記述した場合は変数展開が行われます。ここでは Perl の正規表現でパターン内での配列の変数展開について解説します。

(Last modified: )

パターン内での配列の変数展開

変数と同じく配列をパターン内に記述すると変数展開が行われます。配列の変数展開の仕方はダブルクオーテーションで囲われた文字列の中に配列を記述した場合と同じです。(配列の文字列中の変数展開については「文字列中に含まれる配列の変数展開」を参照して下さい)。

具体的な例で考えてみます。

my @pat = ("blue", "red", "yellow");
my $str = "color is blue";

if ($str =~ /@pat/){
  print "マッチしました。\n";
}

上記ではパターンとして配列名が記述されています。この場合、配列 @pat に格納された値が変数展開され次のように記述した場合と同じになります。

my $str = "color is blue";

if ($str =~ /blue red yellow/){
  print "マッチしました。\n";
}

デフォルトでは配列の各要素がスペースで区切られて展開されるためあまり使い道はないかもしれませんが、特別な変数 $" に対して区切り文字を設定することが可能です。

例えば区切り文字として | を指定して配列の変数展開を行ってみます。

my $str = "color is blue";
my @pat = ("blue", "red", "yellow");
$" = "|";

if ($str =~ /@pat/){
  print "マッチしました。\n";
}

すると次のように記述した場合と同じ結果になります。

my $str = "color is blue red";

if ($str =~ /blue|red|yellow/{
  print "マッチしました。\n";
}

これはメタ文字 | を使って複数の選択肢の中のいずれかにマッチするパターンを記述した場合と同じになります。このように区切り文字を変更することで、配列の各要素の値を選択肢にしたパターンを作成することができます。

なおあまりないと思いますが配列名のあとにすぐにアルファベットが続く場合など、配列名と他のパターン内の文字の区切りが明確で無い場合は、文字列の中に配列を記述する場合と同じく @ 以降の配列名を {} で括って下さい。

my @pat = ("blue", "red", "yellow");
my $str = "color is blue";

if ($str =~ /@{pat}point/){
  print "マッチしました。\n";
}
サンプルコード

それでは簡単なサンプルを作成します。

use strict;
use warnings;
use utf8;
binmode STDIN, ':encoding(cp932)';
binmode STDOUT, ':encoding(cp932)';
binmode STDERR, ':encoding(cp932)';

my @color = ("blue", "red", "white");
$" = "|";

&check("Border color is red");
&check("white snow");
&check("color of sea is blue");

sub check{
  if ($_[0] =~ /is (@color)/){
    print $_[0]." は /is (@color)/ にマッチします。\n";
  }else{
    print $_[0]." は /is (@color)/ にマッチしません。\n";
  }
}

テキストエディタでプログラムを記述したあと sample.pl という名前で保存します。(文字コードは UTF-8 です)。コマンドプロンプトを起動し、プログラムを保存したディレクトリへ移動したあとで次のように実行します。

perl sample.pl

次のように実行結果が表示されます。

パターン内での配列の変数展開(1)

パターンの中に配列の変数が記述されているため、パターンの中で配列が変数展開されました。今回は配列が展開されるときの区切り文字として | を指定しています。文字列とマッチするかどうか調べる場合は、配列の変数展開が終わったあとのパターンとマッチするか調べられます。

-- --

Perl の正規表現でパターン内での配列の変数展開について解説しました。

( Written by Tatsuo Ikura )

Profile
profile_img

著者 / TATSUO IKURA

プログラミングや開発環境構築の解説サイトを運営しています。