第5章のサンプルコード
---------------------
目次（ページ番号）
■P91
■P92-1
■P92-2
■P92-3
■P93
■P94
■P95
■P98
■P100
■P102
■P103
■P104
■P105
■P108
■P109
---------------------

■P91
# 単純な文字列マッチング
#  simple.pl

print "あなたの名前は何ですか: ";
$string = <STDIN>;
chomp($string);

# パターンマッチ
print "こんにちは、太郎さん。\n" if ($string =~ /太郎/);

■P92-1
# 単純な文字列マッチング
#  simple2.pl

print "あなたの名前は何ですか: ";
$string = <STDIN>;
chomp($string);

# パターンマッチ
print "こんにちは、太郎さん。\n" if ($string =~ m#太郎#);

■P92-2
# 単純な文字列マッチング
#  simple_not.pl

print "あなたの名前は何ですか: ";
$string = <STDIN>;
chomp($string);

# パターンマッチ
print "こんにちは、あなたは太郎さんではないですね。\n"
  if ($string !~ /太郎/);

■P92-3
# マッチングの前後パターンを取得する
#  simple_prepost.pl

print "あなたの名前は何ですか: ";
$string = <STDIN>;
chomp($string);

# パターンマッチ
print "パターン前: $`\nパターン: $&\nパターン後: $'\n"
  if ($string =~ /太郎/);

■P93
# 繰り返し検索
#  repeat.pl

$string = "ABCDEFABCDABC";

# gオプションとwhileステートメントで繰り返し検索
print "パターン前: $`\nパターン: $&\nパターン後: $'\n\n"
  while ($string =~ /ABC/g);

■P94
# 大文字小文字を区別しない
#  capital.pl

# 小文字のみで構成
$string = "perl";
print "「perl」にマッチ: $string\n" if ($string =~ /perl/i);

# 大文字のみで構成
$string = "PERL";
print "「perl」にマッチ: $string\n" if ($string =~ /perl/i);

# 大文字と小文字混合で構成
$string = "Perl";
print "「perl」にマッチ: $string\n" if ($string =~ /perl/i);

■P95
# oによる変数展開
#  omark.pl

# 配列と初期マッチ文字列の定義
@array = ("Perl ABC", "ABCDEF", "Perl", "ABC");
$search = "ABC";

# 途中で$searchの値を変更
print "oなしのマッチ\n";
foreach (@array) {
  if ($_ =~ /$search/) {
    $search = "Perl";
    print "$_\n";
  }
}

$search = "ABC";

# 途中で$searchの値を変更。oを使ってマッチ
print "\no付きのマッチ\n";
foreach (@array) {
  if ($_ =~ /$search/o) {
    $search = "Perl";
    print "$_\n";
  }
}

■P98
# 正規表現(.、^、$、*、+、?、|)のテスト
#  regexp.pl

# テスト対象の配列
@array = (
          "ban",
          "banal",
          "banana",
          "bananaland",
          "banana land",
          "banana race",
          "band",
          "bandana",
          "bandit",
          "bangle",
          "dongle",
          "dance",
          "island",
          "sabanna",
          "Vienna",
          100,
          0,
          -1,
          "Perl is No.1",
          "Perl is No.one"
         );

# bananの後に何か1文字を含む要素を検索
print "banan.:\t";
foreach $value (@array) {
  print "$value," if ($value =~ /banan./);
}

# dで始まる要素を検索
print "\n^d:\t";
foreach $value (@array) {
  print "$value," if ($value =~ /^d/);
}

# naで終わる要素を検索
print "\nna\$:\t";
foreach $value (@array) {
  print "$value," if ($value =~ /na$/);
}

# baで始まりnaで終わる要素を検索
print "\n^ba.*na\$:\t";
foreach $value (@array) {
  print "$value," if ($value =~ /^ba.*na$/);
}

# aが0文字以上続いた後にlandが付いている要素を検索
print "\na*land:\t";
foreach $value (@array) {
  print "$value," if ($value =~ /a*land/);
}

# aが1文字以上続いた後にlandが付いている要素を検索
print "\na+land:\t";
foreach $value (@array) {
  print "$value," if ($value =~ /a+land/);
}

# banの後に1文字入るか入らないかで完結する要素を検索
print "\n^ban.?\$:\t";
foreach $value (@array) {
  print "$value," if ($value =~ /^ban.?$/);
}

# bandあるいはdanceを含んでいる要素を検索
print "\nband|dance:\t";
foreach $value (@array) {
  print "$value," if ($value =~ /band|dance/);
}

print "\n";

■P100
# 正規表現([ ]、[^ ])のテスト
#  regexp2.pl

# テスト対象の配列
@array = (
          "ban",
          "banal",
          "banana",
          "bananaland",
          "banana land",
          "banana race",
          "band",
          "bandana",
          "bandit",
          "bangle",
          "dongle",
          "dance",
          "island",
          "sabanna",
          "Vienna",
          100,
          0,
          -1,
          "Perl is No.1",
          "Perl is No.one"
         );

# banの後にd〜gを含む要素を検索
print "ban[d-g]:\t";
foreach $value (@array) {
  print "$value," if ($value =~ /ban[d-g]/);
}

# banの後にd〜gを含まない要素を検索
print "\nban[^d-g]:\t";
foreach $value (@array) {
  print "$value," if ($value =~ /ban[^d-g]/);
}

# 数値だけで構成されている要素を検索
print "\n^[0-9]+\$:\t";
foreach $value (@array) {
  print "$value," if ($value =~ /^[0-9]+$/);
}

# 大文字を含んでいる要素を検索
print "\n[A-Z]:\t";
foreach $value (@array) {
  print "$value," if ($value =~ /[A-Z]/);
}

# 大文字か数字を含んでいる要素を検索
print "\n[A-Z0-9]:\t";
foreach $value (@array) {
  print "$value," if ($value =~ /[A-Z0-9]/);
}

print "\n";

■P102
# 正規表現(\d、\D、\s、\S)のテスト
#  regexp3.pl

# テスト対象の配列
@array = (
          "ban",
          "banal",
          "banana",
          "bananaland",
          "banana land",
          "banana race",
          "band",
          "bandana",
          "bandit",
          "bangle",
          "dongle",
          "dance",
          "island",
          "sabanna",
          "Vienna",
          100,
          0,
          -1,
          "Perl is No.1",
          "Perl is No.one"
         );

# 数値を含む要素を検索
print "\\d+:\t";
foreach $value (@array) {
  print "$value," if ($value =~ /\d+/);
}

# 「Perl is No.」で始まり、その後に数値以外の文字が続く要素を検索
print "\nPerl is No\\.\\D:\t";
foreach $value (@array) {
  print "$value," if ($value =~ /Perl is No\.\D/);
}

# 空白文字を含む要素を検索
print "\n\\s:\t";
foreach $value (@array) {
  print "$value," if ($value =~ /\s/);
}

# bananaの後に空白文字を含まない要素を検索
print "\nbanana\\S:\t";
foreach $value (@array) {
  print "$value," if ($value =~ /banana\S/);
}

print "\n";

■P103
# 正規表現(\w、\W、( ))のテスト
#  regexp4.pl

# テスト対象の配列
@array = (
          "ban",
          "banal",
          "banana",
          "bananaland",
          "banana land",
          "banana race",
          "band",
          "bandana",
          "bandit",
          "bangle",
          "dongle",
          "dance",
          "island",
          "sabanna",
          "Vienna",
          100,
          0,
          -1,
          "Perl is No.1",
          "Perl is No.one"
         );

# 特定の単語の並びになっている要素を検索
foreach $value (@array) {
  print "$1, $2, $3, $4\n" 
    if ($value =~ /(\w+)\W+(\w+)\W+(\w+)\.(\w+)/);
}

■P104
# グループ化
#  group.pl

# テスト対象の配列
@array = (
  "beginner",
  "feminine",
  "tin",
  "tininess",
  "tinny"
);

# in+[^in]にマッチするものを表示
print "in+[^in] :\t";
foreach $value (@array) {
  print "$value," if ($value =~ /in+[^in]/);
}
print "\n";

# (in)+[^in]にマッチするものを表示
print "(in)+[^in] :\t";
foreach $value (@array) {
  print "$value," if ($value =~ /(in)+[^in]/);
}
print "\n";

■P105
# 日本語文字列への正規表現
#  jencoding.pl

# Shift_JISとしてencodingモジュールの登録
# (Unix環境では use encoding "euc-jp";)
use encoding "Shift_JIS";

$hiragana = 0;

print "文字列を入力: ";
$string = <STDIN>;
chomp($string);


while ($string =~ /[ぁ-ん]/g) {

  $hiragana++;
}

print "平仮名は${hiragana}個でした。\n";

■P108
# 簡単な置き換え
#  replace.pl

$string = <<EOT
こんにちは、太郎さん。

お元気ですか、太郎さん。
EOT
  ;

# 置き換え
$string =~ s/太郎/花子/g;

# 表示
print $string;

■P109
# スペース文字で区切った2値の積を表示
#  multi.pl

print "2つの数値をスペースで区切って入力してください: ";
$string = <STDIN>;
chomp($string);

# eオプションを使って直接演算する(負数や小数点も範囲に入れた正規表現)
$string =~ s/(\-?\d+\.?\d*)\s+(\-?\d+\.?\d*)/$1 * $2/e;

# 表示
print "$string\n";
