はじめての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