はじめてのPerl 第8章 正規表現によるマッチ 練習問題5
練習問題4を元にaで終わるワードの直後に続く最大5文字を別のキャプチャ変数にキャプチャしてください。コードを書き換え療法のキャプチャを表示するようにしてください。
#!/usr/bin/perl use strict; use warnings; use 5.010; while (<>) { chomp; my $names = "names"; if ($_ =~ /(?<$names>\b\w*a\b)(.{0,5})/){ print "'$names' contains '$+{names}$2'\n"; }else{ print "No Matche: $_ \n"; } }
引数として渡すファイルの内容は以下の通りです。
fred
wilma yesterday
barney
wilma&betty
camellia
anna
te
a
Mrs. wilma Frintstone
wilma!
wilma?
wilma test
wilma aiueokaki
wilmawilma
実行コマンドは以下のとおりです。
$ ./practice5.pl < names.txt
結果は以下のようになります。
No Matche: fred
'names' contains 'wilma yest'
No Matche: barney
'names' contains 'wilma&bett'
'names' contains 'camellia'
'names' contains 'anna'
No Matche: te
'names' contains 'a'
'names' contains 'wilma Frin'
'names' contains 'wilma!'
'names' contains 'wilma?'
'names' contains 'wilma '
'names' contains 'wilma aiue'
'names' contains 'wilmawilma'
はじめてのPerl 第8章 正規表現によるマッチ 練習問題4
練習問題3のコードを元に、$1の代わりに名前付きキャプチャを使うようにしてください。コードを書き終えてそのラベル名を表示するようにしてください。
#!/usr/bin/perl use strict; use warnings; use 5.010; while (<>) { chomp; my $names = "test"; if ($_ =~ /(?<$names>\b\w*a\b)/) { print "'$names' contains '$+{$names}'\n"; } else { print "No match: | $_ | \n"; } }
実行コマンドは以下の通りです。
./practice4.pl < names.txt
結果は以下の通りです。
No match: | fred |
'test' contains 'wilma'
No match: | barney |
'test' contains 'wilma'
'test' contains 'camellia'
'test' contains 'anna'
No match: | te |
'test' contains 'a'
'test' contains 'wilma'
初めてのPerl 第8章 正規表現によるマッチ 練習問題3
練習問題2を応用し、aで終わるワードを$1にキャプチャしてください。コードを書き終えて変数$1の内容をシングルクウォートで囲んで表示します。
#!/usr/bin/perl use strict; use warnings; use 5.010; while (<>) { chomp; if ($_ =~/(\b\w*a\b)/) { print " \$1 contains: '$1'\n"; } else { print "No match: | $_ | \n"; } }
実行コマンドは以下の通りです。
./practice3.pl < names.txt
実行結果は以下の通りです。
No match: | fred |
$1 contains: 'wilma'
No match: | barney |
$1 contains: 'wilma'
$1 contains: 'camellia'
$1 contains: 'anna'
No match: | te |
$1 contains: 'a'
$1 contains: 'wilma'
初めてのPerl 第8章 正規表現によるマッチ 練習問題2
パターンテストプログラムを使い、ワードのどれかがaで終わっていたらマッチするようなパターンを作ってください。wilma&fredなどにもマッチするように実装してください。
#!/usr/bin/perl use strict; use warnings; use 5.010; #末尾がaで終わるものにマッチさせる。 while (<>) { chomp; if ($_ =~ /\b\w*a\b/) { print "Matched: |$`<$&>$'|\n"; } else { print "No match: | $_ | \n"; } }
実行したコマンドは以下の通りです。
$ ./practice2.pl < names.txt
引数として渡したnames.txtの内容は以下のようになります。
fred
wilma
barney
wilma&betty
camellia
anna
te
a
Mrs. wilma Frintstone
結果は以下の通りです。
No match: | fred |
Matched: |<wilma>|
No match: | barney |
Matched: |<wilma>&betty|
Matched: |<camellia>|
Matched: |<anna>|
No match: | te |
Matched: |<a>|
Matched: |Mrs. <wilma> Frintstone|
初めてのPerl 第8章 正規表現によるマッチ 練習問題1
パターンテストプログラムを利用して、文字列matchにマッチするパターンを記述してください。文字列beforematchafterを入力値として与えてください。
#!/usr/bin/perl use strict; use warnings; use 5.010; while (<>) { # take one input line at a time chomp; if ($_ =~ /match/) { print "Matched: |$`<$&>$'|\n"; # the special match vars } else { print "No match: |$_|\n"; } }
実行したコマンドは以下の通りです。
$ ./practice1.pl
beforematchafter
結果は以下の様になりました。
Matched: |before<match>after|
初めてのPerl 第7章正規表現の世界 練習問題6
読み込んだ行のうちwilmaとfredの両方を含む行をすべて出力しています。
#!/usr/bin/perl use strict; use warnings; use Data::Dumper; open (FILE, "<", "names.txt"); foreach my $name (<FILE>){ if ($name =~/wilma/ && $name =~/fred/){ print $name; } }
以下読み込んでいるファイルの内容になります。
Fred
FRED
FRed
Fred
mississippi
Bamm-Bamm
llam
fred wilma
wilma fred
betty
BETTY
beTty
fred betty wilma
以下実行結果です。
fred wilma
wilma fred
fred betty wilma
初めてのPerl 第7章正規表現の世界 練習問題5
読み込んだ行のうち、2回連続して同じ文字が現れている行を表示する。
#!/usr/bin/perl use strict; use warnings; open (FILE, "<", "names.txt"); #大文字小文字を区別して、連続した文字が2つ出てきたときにマッチさせる。 foreach my $name (<FILE>){ if($name =~ /(.)\1/){ print $name; } } =pod #大文字小文字を区別しないで、連続した文字が2つ出てきたときにマッチさせる foreach my $name (<FILE>){ if($name =~ /(.)\1/i){ print $name; } } =cut
読み込んでいるファイル内容は以下の通りです。
frederick
Fred
FRED
FRed
Fred
mississippi
Bamm-Bamm
llam
betty
BETTY
beTty
実行結果は以下の通りです。
ississippi
Bamm-Bamm
llam
betty
BETTY