変数の展開

広告

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

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

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

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

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

my $str = "copy and paste";

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

このように変数を指定することで、パターンを動的に指定することが出来ます。

先ほどは変数名だけをパターン内で指定しましたが、他のパターンと組み合わせることも可能です。

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

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

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

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

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

サンプルプログラム

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

test1-1.pl

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

&check1("and", "copy and paste");
&check2("(J|j)ava", "disable JavaScript");
&check2("(J|j)ava", "disable javaScript");
&check2("(J|j)ava", "disable javascript");

sub check1{
  my ($pattern, $str) = @_;

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

sub check2{
  my ($pattern, $str) = @_;

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

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

変数の展開

( Written by Tatsuo Ikura )