配列の展開

広告

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

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

my @pattern = ("color", "red");
my $str = "background color red";

if ($str =~ /@pattern/){
  print "$str¥n";
}

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

my $str = "background color red";

if ($str =~ /color red/){
  print "$str¥n";
}

基本的には変数を記述した場合と同じです。(デフォルトでは配列の各要素がスペースで区切られて展開されますが、特別な変数「$"」に対して区切り文字を設定することが可能です)。

変数の場合と同じく配列名と他のパターンを組み合わせることも可能です。

my $pattern = "and";
my $str = "copy and paste";

if ($str =~ /¥w@pattern/){
  print "$str¥n";
}

また配列名と他のパターン内の文字の区切りが明確で無い場合は、文字列の中に配列を記述する場合と同じく「@」以降の配列名を{}で括って下さい。

my @pattern = ("color", "red ");
my $str = "background color red and foreground color black";

if ($str =~ /@{pattern}and/){
  print "$str¥n";
}

サンプルプログラム

では簡単なプログラムで確認して見ます。

test2-1.pl

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

$" = "|";
&check("background red");
&check("foreground yellow");
&check("border white");

sub check{
  my ($str) = @_;
  my @color = ("black", "red", "white");

  if ($str =~ /(@color)/){
    print "対象文字列: $str¥nマッチ部分: $&¥n¥n";
  }
}

上記を「test2-1.pl」の名前で保存します(文字コードはUTF-8です)。そしてコマンドプロンプトを起動し、プログラムを保存したディレクトリに移動してから次のように実行して下さい。

配列の展開

今回のサンプルでは配列の変数展開時の区切り文字として変数「$"」に対して「|」を設定しています。よってパターンは「/(black|red|white)/」となっています。

( Written by Tatsuo Ikura )