P.165
例:「種々のパターンの定義」

/明治|大正|昭和/ "明治|大正|昭和" '明治|大正|昭和'
■「標準」と「汎用型」の定義の例
$a = 'こんにちは!'; $a = q/こんにちは!/; $a = "こんにちは!"; $a = qq|こんにちは!|; @a = ("リンゴ","桃","みかん"); qw +リンゴ 桃 みかん+; "リンゴ|桃|みかん"; qr/リンゴ|桃|みかん/; /リンゴ|桃|みかん/; m!リンゴ|桃|みかん!;
6.置換
s/リンゴ /林檎 /; s*リンゴ*林檎*; s(リンゴ){林檎};
7.変換
y/ぁ-ん/ァ-ン/; tr?ぁ-ん?ァ-ン?; tr<ぁ-ん>[ァ-ン];
例1:「マッチする」
$momo = "ここの桃はおいしい!"; $k = ($momo =~ /桃/); print $k;
<実行結果> 1
例2:「マッチしない」
$momo = "ここの柿はおいしい!"; $k = ($momo !~ /桃/); print $k;
<実行結果> 1 例1:「マッチした文字列」
$_ = "桃栗3年柿8年。"; /3年/; print $&;
<実行結果> 3年
例2:「マッチした部分より前の文字列全て」
$_ = "桃栗3年柿8年。"; /3年/; print $`;
<実行結果> 桃栗
例3:「マッチした部分より後の文字列全て」
$_ = "桃栗3年柿8年。"; /3年/; print $';
<実行結果> 柿8年。
例1:「i オプション」
$_ = "Apple Pie はおいしい。"; $k = /apple/i; print $&;
<実行結果> Apple
例2:「g オプション」
$_ = "ここの桃は、あっちの桃よりおいしい。"; s/桃/柿/g; print $_;
<実行結果> ここの柿は、あっちの柿よりおいしい。
例3:「m オプション」
$_ = "\n桃と柿には、シーズンがあります。"; /^.../m; print $&;
<実行結果> 桃と柿
例4-1:「s オプション」
$_ = <<EOF; 桃と柿 びわと梨 EOF /柿.../s; print $&;
<実行結果> 柿 びわ
例4-2:「s オプション(行頭)」
$_ = "\n桃と柿には、シーズンがあります。"; /^.../s; print $&;
<実行結果> 桃と
例6:「x オプション」
$_ = "桃栗3年柿8年。"; / モモ | 桃 /gx; print $&;
<実行結果> 桃
例1:「桃という語」
$_ = "これは、桃からできた Peach pie オイシイ!"; /桃/; print $&;
<実行結果> 桃
例2:「先頭の2文字」 /^../ → これ
例3:「末尾の2文字」 /..$/ → イ!
例4:「"Peach" または "桃" という語」 /Peach|桃/ → 桃
例5:「は、わ、ハ の何れかの文字」 /[はわハ]/ → は
例6:「半角英小文字から始まる部分の3文字分」 /[a-z]../ → eac 例7:「カタカナから始まる部分の3文字分」 /[ァ-ン]../ → オイシ
例1:「先頭語 + 1 文字」
$_ = "桃で作る Peach pie !"; /\A./; print $&;
<実行結果> 桃
例2:「単語の境界 + 3 文字」 /\b.../ → Pea
例3:「単語以外の境界 + 3 文字」 /\B.../ → 桃で作
例4:「数字以外の1文字 + 3 文字」 /\D.../ → 桃で作る
例5:「半角スペース1文字 + 3 文字」 /\s.../ → Pea
例6:「半角英数字 + 3 文字」 /\w.../ → Peac
例7:「3 文字 + 文字列の最後」 /...\z/ → e !
例8:「数字1つ + 1 文字」 $_ = "桃が 5個 あります。"; /\d./; # 5個 print $&;
例9:「半角英数字と _ 以外 + 3 文字」 $_ = "Peach は桃です。"; /\W.../; # は桃で print $&;
■正規表現でのリピート演算子の役割
print "*" x 10;
<実行結果>
**********
例1:「* / 0 回以上 / 最長マッチ」
$_ = "木、おどろ木、桃の木、さんしょの木。"; /^.*木/; print $&;
<実行結果> 木、おどろ木、桃の木、さんしょの木
例2:「*? / 0 回以上 / 最短マッチ」 /^.*?木/; → 木
例3:「+ / 1 回以上 / 最長マッチ」 /^.+木/; → 木、おどろ木、桃の木、さんしょの木
例4:「+? / 1 回以上 / 最短マッチ」 /^.+?木/; → 木、おどろ木
例5:「{9} / 9 回ちょうど」 /^.{9}木/; → 木、おどろ木、桃の木
例1:「最長マッチ (http アドレスの抽出)」
$_ = "アドレスは http://perl.com/user/eg/cgi/sample/test.html/ です。"; m"http.+/"; print $&;
<実行結果> http://perl.com/user/eg/cgi/sample/test.html/
例2:「最短マッチ(郵便番号の抽出)」
$_ = "氏名:青山 霞, 郵便:100-1234, 住所:東京, 電話:03-1111-2222,"; /郵便:.*?,/; print $&;
<実行結果> 郵便:100-1234,
例1:「パターン内マッチ変数(マッチ)」
$num = "1234"; $check = "暗証番号:1234 $num"; print "一致しました!" if $check =~ /:(.+) \1/ ;
<実行結果> 一致しました!
例2:「パターン内マッチ変数(置換)」
$_ = "好きな果物は「桃とすいか」です。"; s/「(.+)と(.+)」/「\2と\1」/; print $_;
<実行結果> 好きな果物は「すいかと桃」です。
例2:「パターン外マッチ変数(ピンポイントマッチ)」
$_ = "氏名:青山 霞, 郵便:100-1234, 住所:東京, 電話:03-1111-2222,"; /氏名:(.*?),.*郵便:(.*?),.*電話:(.*?),/; print "$1 は $2 と $3 です。";
<実行結果> 青山 霞 は 100-1234 と 03-1111-2222 です。
例1:「1つのまとまりを変数化」
$fav = "私の好きな果物は「桃とすいか」です。"; $peach = "もも|モモ|桃"; $fav =~ /「.*($peach).*」/; print "$1 はお気に入り!" if $1;
<実行結果> 桃 はお気に入り!
例2:「オプション値の設定」
$photo = "風景:MOUNT.JPG, LAKE.GIF, River.Jpg, Ocean.Gif"; $jpg = qr/(\.jpg)|(\.gif)/i; $photo =~ s/$jpg/\L\1\2/g; print $photo;
<実行結果> 風景:MOUNT.jpg, LAKE.gif, River.jpg, Ocean.gif
例1:「特殊変数 $_ に対してのマッチング」
$_ = "そこには大正時代のモダンな建築があった。"; $k = /明治|大正|昭和/; print $k;
<実行結果> 1
例2:「変数を指定したマッチング」
$modern= "そこには大正時代のモダンな建築があった。"; $k = ($modern =~ /明治|大正|昭和/); print $k;
<実行結果> 1
例3:「否定形に「真」となるマッチング」
$modern= "そこには大正時代のモダンな建築があった。"; $k = ($modern !~ /明治/); print $k;
<実行結果> 1
例4:「汎用型でのマッチング」
$_ = "試験の結果 /英語:65/数学:90/国語:100/ "; $k = m"/"; print $k;
<実行結果> 1
例5:「改行のある文字列内でのマッチング」
$_ = <<EOF; 今日は良いお天気。 でも、明日は雨みたい。 EOF $k = /雨/; print $k;
<実行結果> 1
例1:「$_ の評価」
$_ = "そこには大正時代にできたと思われるモダンな建築があった。"; if (/明治|大正|昭和/) {print "「$&」の文字が見つかりました。"} else {print "何れの文字も見つかりませんでした。"}
<実行結果> 「大正」の文字が見つかりました。
例2:「任意の変数に対する評価」
$modern = "そこには大正時代にできたと思われるモダンな建築があった。"; if ($modern =~ /明治|大正|昭和/) {print "「$&」の文字が見つかりました。"} else {print "何れの文字も見つかりませんでした。"}
<実行結果> 「大正」の文字が見つかりました。
例1:「最初のマッチ」
$momo = "ここの桃は、桃の木からの取りたての桃です。"; $momo =~ /桃./; print $&;
<実行結果> 桃は
例2:「ループ処理による全てのマッチ部分の表示」
$momo = "ここの桃は、桃の木からの取りたての桃です。"; while ($momo =~ /桃./g) {print "$& "}
<実行結果> 桃は 桃の 桃で
例1:「当選番号下2桁の早見表」
@post = qw "A0102組001152 B0203組112215 C0304組273380 D0404組858234"; print "当選番号早見表 \n"; for (@post) {print "$& \n" if /..\z/}
<実行結果> 当選番号早見表 52 15 80 34
例2:「当選番号下2桁の表示(ソート)」
@post = qw "A0102組001152 B0203組112215 C0304組273380 D0404組858234"; print "当選番号早見表 \n"; for (@post) {push @ps, "$& \n" if /..\z/} print sort @ps;
<実行結果> 当選番号早見表 15 34 52 80
例:「外部ファイルの中の検索」 「桃太郎 第1話.txt」
「桃太郎 第1話」 昔々、ある処にお爺さんとお婆さんが住んでいました。 お爺さんは山へ柴刈りに、 お婆さんは川へ洗濯をしに行きました。 (つづく)
open F, "桃太郎 第1話.txt"; for (<F>) { ++$k; if (/お爺さん|おじいさん|おぢいさん/) {print "「$&」が $k 行目に見つかりました。\n"; $d = 1 } } print "見つかりませんでした。" if ($d < 1);
<実行結果> 「お爺さん」が 2 行目に見つかりました。 「お爺さん」が 3 行目に見つかりました。
■置換の基本 $a =~ s/2001年/2002年/g; 例1:「最初の文字列のみの置換」
$a = <<EOF; 《試合会場のお知らせ》 2001年4月1日 2001年から2005年までの試合会場 2001年:シアトル 2002年:ヘルシンキ 2003年:デュッセルドルフ 2004年:ペテルスブルグ 2005年:東京 EOF $a =~ s/2001年/2002年/; print $a;
<実行結果> 《試合会場のお知らせ》 2002年4月1日 2001年から2005年までの試合会場 2001年:シアトル 2002年:ヘルシンキ 2003年:デュッセルドルフ 2004年:ペテルスブルグ 2005年:東京
例2:「全部の文字列の置換」
$a = <<EOF; 《試合会場のお知らせ》 2001年4月1日 2001年から2005年までの試合会場 2001年:シアトル 2002年:ヘルシンキ 2003年:デュッセルドルフ 2004年:ペテルスブルグ 2005年:東京 EOF $a =~ s/2001年/2002年/g; print $a;
<実行結果> 《試合会場のお知らせ》 2002年4月1日 2002年から2005年までの試合会場 2002年:シアトル 2002年:ヘルシンキ 2003年:デュッセルドルフ 2004年:ペテルスブルグ 2005年:東京
例3:「不要な文字列 "xyz" の削除」
$a = "xyzAxyzrxyzcxyzhxyzixyzmxyzexyzdxyzexyzsxyz"; $a =~ s/xyz//g; print $a;
<実行結果> Archimedes
例4:「/ による3つ区切り」
$DNA = "AGTATGCGTGACCATCTA"; $DNA =~s{(...)}(\1/)g; print $DNA;
<実行結果> AGT/ATG/CGT/GAC/CAT/CTA/
例1:「任意個のスペース区切りの置換」
$a = "此処 何処 其処"; $a =~ s( +| +){|}g; print $a;
<実行結果> 此処|何処|其処
例2:「任意個のキーワードによる検索」 「桃太郎 第1話.txt」 「桃太郎 第1話」 昔々、ある処にお爺さんとお婆さんが住んでいました。 お爺さんは山へ柴刈りに、 お婆さんは川へ洗濯をしに行きました。 (つづく)
print "キーワード:"; $kw = <STDIN>; chomp $kw; $kw =~ s( +| +){|}g; print "\n"; open F, "桃太郎 第1話.txt"; for (<F>) { ++$k; if (/$kw/o) {print "「$&」が $k 行目に見つかりました。\n"; $d = 1 } } print "見つかりませんでした。" if ($d < 1);
<実行結果> キーワード:お爺さん おじいさん おぢいさん 「お爺さん」が 2 行目に見つかりました。 「お爺さん」が 3 行目に見つかりました。
例1:「s/ / / と tr/ / / の違い」
$a = $b = "優優優 優優良 優良良 優良可"; $a =~ s/優良可/ABC/g; $b =~ tr/優良可/ABC/; print " s = $a \n tr = $b";
<実行結果> s = 優優優 優優良 優良良 ABC tr = AAA AAB ABB ABC
例2:「文字の入れ替え」
$a = <<EOF; 《入場の仕方》 今回の入場は 1年→2年→3年 の順に行います。 EOF $a =~ tr/123/231/; print $a;
<実行結果> 《入場の仕方》 今回の入場は 2年→3年→1年 の順に行います。
例3:「英小文字→英大文字、かな→カナ変換」
$a = $b = $c = "abc ABC あいう アイウ"; $b =~ tr/a-z/A-Z/; $c =~ tr/a-zあ-ん/A-Zア-ン/; print " a = $a \n b = $b \n c = $c";
<実行結果> a = abc ABC あいう アイウ b = ABC ABC あいう アイウ c = ABC ABC アイウ アイウ
例:「かな→カナ変換」
@fruits = qw (もも くり かき なし みかん); for (@fruits) {tr/ぁ-ん/ァ-ン/} print "@fruits";
<実行結果> モモ クリ カキ ナシ ミカン