マッチした文字列全体を取得($&)

広告

対象の文字列の中でパターンにマッチする部分を取得する方法を確認します。

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

my $str = "book is 2000yen, cake is 800yen";

if ($str =~ /¥d+yen/){
  print "$str¥n";
}

上記の場合、数値で構成される文字に「yen」が続く文字列にマッチします。この時マッチに成功すると自動的に特別な変数である「$&」にマッチした文字列全体が格納されます。

$&  マッチした文字列が格納される

今回の場合は「2000yen」にマッチします。よって変数「$&」には「2000yen」が格納されます。なお今回の場合は「2000yen」以外に「800yen」にもマッチしますが最初にマッチが成功した時点で結合演算子(=~)は評価が終わりますので「2000yen」が格納されることになります。

変数「$&」が次に書き換えられるまでマッチした文字列が格納されていますので、変数の値を表示したり他の変数に値を格納したりすることが出来ます。

my $str = "book is 2000yen, cake is 800yen";

if ($str =~ /¥d+yen/){
  print "マッチした文字列 : $&¥n";
}

なお「$&」は処理効率が悪いと言われていますので、可能であれば後のページで解説する「$1」などを使用して下さい。

サンプルプログラム

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

test1-1.pl

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

&check("book is 2000yen, cake is 800yen");
&check("orange is 950yen");

sub check{
  my ($str) = @_;

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

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

マッチした文字列全体を取得

( Written by Tatsuo Ikura )