s/ Perl5 Regular Expression /Perl6 Regex and Rules /mixes

Download Report

Transcript s/ Perl5 Regular Expression /Perl6 Regex and Rules /mixes

s/ Perl5 Regular Expression /
Perl6 Regex and Rules /mixes;
竹迫 良範
謝罪
今日は真面目な
プレゼンです
m(_ _)m
2
はじめに
3
自己紹介
 My Name is
 竹迫良範
 Yoshinori TAKESAKO
 Perlとの関係
 1997
 Perlと出会う
 2003
 mod_perl C10K Problem
※モヒカン族では
ありません
http://namazu.org/~takesako/
http://labs.cybozu.co.jp/blog/takesako/
 2005
 ppencode
 Joined CybozuLabs, Inc.
4
My first
computer
6
いきなり32bit世代
- F-BASIC 386 Compiler
- x86 Assembler
- LSI C-86試食版(DOS)
ゲームばっかり作って遊んでました
7
広島市立大学
情報科学部
1995年
C, X11(Xlib), UNIX Network Programming
 Require
 X Window System, Version 11 Release 5 ~
 OS
 Linux 2.0.17
 SunOS Release 4.1.3
 Solaris 2.1
 IRIX Release 5.3
 Machines
 Sun SPARC station LX
 Sun SPARC station 5
 Gateway 2000 HandBook i486 やっぱりゲーム作ってました(汗)
9
当時の流行
Java ~
10
11
My Programming History
@Home
@school
@office
Java
BASIC
x86
?
C
Perl
Portability
FM TOWNS
限定された独自
アーキテクチャ
UNIX
Network
X11
Windows
HP-UX
Linux
12
Perl を選択
13
現在に至る
Shibuya Perl Mongers リーダー交代式
Basokiya 2006 Cup
いまここ
14
Perl 6 Today
yesterday
15
16
17
audreyt++
18
Today’s Perl 6 Talks
09:30- Dan “Fred” Kogai
ふつうの Perl 6 入門
An Ordinary Perl6 Guide
13:15- Yoshinori Takesako
s/ Perl5 Regular Expression /
Perl6 Regex and Rules /mixes;
正規表現にフォーカスした Perl 6 入門
19
正規表現
Perl 5  Perl 6
20
Agenda
21
Perl5 正規表現  Perl6 Regex で変わるもの
 1. 基本パターン
 繰り返し *+? と選択 |
 2. マッチ演算子
 文字列のパターンマッチ m//
 スマートマッチ演算子 ~~
 文字列の置換 s///
 3. 修飾子








複数行モード/m 修飾子の廃止
文字列の先頭「\A」末尾「\z」の廃止
スペースとコメントが自由に挿入できるモード/x がデフォルトに
スペースのマッチ
単一行モード/s の廃止
/e 修飾子の廃止
新しい修飾子の書き方
空白マッチ修飾子:w
22
Perl5 正規表現  Perl6 Regex で変わるもの
4. キャプチャ
キャプチャ括弧(…)と後方参照
キャプチャを伴わない括弧 […]
5. メタキャラクタ
文字クラスの定義 <[a-z]>
定義済み文字クラスの参照 <class>
変数展開 <$var>
文字列 <'string'> のリテラル展開
文字列配列 @strings のリテラル展開
23
Perl5 正規表現  Perl6 Regex の未来
6. クロージャ
コードの実行 {code}
マッチ失敗 {fail}
繰り返し範囲 **{n..m}
7. ルール
rule
grammar
8. Perl5互換の正規表現
ご安心ください
24
1. 基本パターン
25
繰り返し *+? と選択 |
Perl 6
Perl 5
/x*/
/y+/
/z?/
/foo|bar/
#
#
#
#
xが0個以上繰り返し
yが1個以上繰り返し
zが0個以上1個以下
fooまたはbar
$_ = "aaa bbb ccc foo moo zoo";
if (/aaax*/) { print "ok\n" }
if (/b+/)
{ print "ok\n" }
if (/cccc?/) { print "ok\n" }
if (/foo|bar|baz/) { print "ok\n" }
/x*/
/y+/
/z?/
/foo|bar/
$_
if
if
if
if
#
#
#
#
==
==
==
==
Perl
Perl
Perl
Perl
5
5
5
5
= "aaa bbb ccc foo moo zoo";
/aaax*/ { say "ok" }
/b+/
{ say "ok" }
/cccc?/ { say "ok" }
/foo|bar|baz/ { say "ok" }
26
2. マッチ演算子
27
文字列のパターンマッチ m//
Perl 6
Perl 5
/pattern/
m/pattern/
m{pattern}
qr/pattern/
/pattern/
m/pattern/
m{pattern}
rx/pattern/
$_ = "This is a pen.";
$_ = "This is a pen.";
if /This/ { say "ok" }
if m/pen/ { say "ok" }
if m{pen} { say "ok" }
unless /not match/ { say "ok" }
if ($_ ~~ rx/pen/) { say "ok" }
if (/This/) { print "ok\n" }
if (m/pen/) { print "ok\n" }
if (m{pen}) { print "ok\n" }
unless (/not match/) { print "ok\n" }
if ($_ =~ qr/pen/) { print "ok\n" }
または regex{pattern}
※ただし、Pugs6.2.13 では「m##」や「m()」の記号を使用するとエラーになります
28
スマートマッチ演算子 ~~
Perl 5
$str =~ /pattern/
$str !~ /pattern/
Perl 6
$str ~~ /pattern/
$str !~~ /pattern/
/pattern/ ~~ $str
/pattern/ !~~ $str
my $str = "This is a pen.";
my $str = "This is a pen.";
if ($str =~ /This/) { print "ok\n" }
if $str ~~ /This/ { say "ok" }
if ($str =~ m/pen/) { print "ok\n" }
if $str ~~ m/pen/ { say "ok" }
## (m/pen/ =~ $str) とは書けない
if m/pen/ ~~ $str { say "ok" }
if ($str !~ /not match/) { print "ok\n" }
if $str !~~ /not match/ { say "ok" }
unless ($str ~~ /not match/) { print "ok\n" }
unless $str ~~ /not match/ { say "ok" }
29
文字列の置換 s///
Perl 5
Perl 6
s/pattern/replace/
s/pattern/replace/
s{pattern}{replace}
s{pattern} = 'replace'
s{pattern}{replace}
my $str = "This is a pen.";
my $str = "This is a pen.";
if ($str =~ s/pen/book/) {
if ($str eq "This is a book.") { print "ok\n" }
}
if ($str =~ s{book}{notebook}) {
if ($str eq "This is a notebook.") { print "ok\n" }
}
if $str ~~ s/pen/book/ {
if $str eq "This is a book." { say "ok" }
}
if $str ~~ s{book} = 'notebook' {
if $str eq "This is a notebook." { say "ok" }
}
※Rubyでは文字列の置換を「s[/pattern/] = 'replace'」と書くことができる。
30
3. 修飾子
31
複数行モード/m 修飾子の廃止
Perl 5
/^ pattern $/m
Perl 6
/^^ pattern $$/
正規表現の修飾子/mで「^」と「$」のマッチ規則が変わる
my
if
if
if
}
$lines = "aaa\nbbb\nccc\n";
($lines =~ /^b/m) { print "ok\n" }
($lines =~ /bb$/m) { print "ok\n" }
($lines =~ /^bbb$/m) {
print "ok\n";
my
if
if
if
$lines = "aaa\nbbb\nccc\n";
$lines ~~ /^^b/ { say "ok" }
$lines ~~ /bb$$/ { say "ok" }
$lines ~~ /^^bbb$$/ {
say "ok" ;
}
32
文字列の先頭「¥A」末尾「¥z」の廃止
Perl 5
/\A pattern \z/
Perl 6
/^ pattern $/
複数行モード/m に影響しないアンカー記号「\A」「\z」
my
if
if
if
}
$str = "abracadabra";
($str =~ /\Aabra/) { print "ok\n" }
($str =~ /abra\z/) { print "ok\n" }
($str =~ /\Aabracadabra\z/) {
print "ok\n" ;
my
if
if
if
$str
$str
$str
$str
say
= "abracadabra";
~~ /^abra/ { say "ok" }
~~ /abra$/ { say "ok" }
~~ /^abracadabra$/ {
"ok" ;
}
33
スペースとコメントが自由に
挿入できるモード/x がデフォルトに
Perl 5
Perl 6
/ pattern1 # コメントをここに書く
/ pattern1 # コメントをここに書く
pattern2 pattern3
pattern2 pattern3
/x
/
my $str = "abracadabra";
my $str = "abracadabra";
abra # アブラ
ca # カ
d abra # ダブラ
/
# 正規表現の終了
) { say "ok" }
if ( $str =~ /
if ( $str ~~ /
if ( $str =~ / abra cad abra /x )
{ print "ok\n" }
if $str ~~ / abra cad abra /
{ say "ok" }
abra # アブラ
ca # カ
d abra # ダブラ
/x
# 正規表現の終了
) { print "ok\n" }
34
スペースのマッチ
Perl 5
Perl 6
/\ /x
/\Q \E/x
/[ \t\r\n]/x
/[ \t\r\n]+/x
/\ /
/<' '>/
/<space>/
/<ws>/
my $str = "This is\ta \n pen.";
if ($str =~ / This \ is
/x)
{ print "ok\n" }
if ($str =~ / This \Q \E is
/x)
{ print "ok\n" }
if ($str =~ / is [ \t\r\n] a
/x)
{ print "ok\n" }
if ($str =~ / a [ \t\r\n]+ pen /x)
{ print "ok\n" }
my $str = "This is\ta \n pen
if $str ~~ / This \ is
/
{ say "ok" }
if $str ~~ / This <' '> is /
{ say "ok" }
if $str ~~ / is <space> a /
{ say "ok" }
if $str ~~ / a <ws> pen
/
{ say "ok" }
.";
35
単一行モード/s の廃止
Perl 5
Perl 6
/./s
# どんな文字にもマッチ(改行を含む)
/./
# 改行を含むどんな文字にもマッチ
/./
# どんな文字にもマッチ(改行は除く)
/\N/
# 改行以外のどんな文字にもマッチ
/[\x0D\x0A]|\x0D\x0A/ # どんな端末の改行
/\n/
# どんな端末の改行にもマッチ
my $c = '/***********************
* This is a C comment *
***********************/
#include <stdio.h>
/* first */
main() { printf("C"); }';
if ($c =~ m/(\/\*.+?\*\/)/) {
if ($1 eq "/* first */") { print "ok\n" }
}
if ($c =~ m/(\/\*.+?\*\/)/s) {
my $lines = $1;
if ($lines =~ /comment/) { print "ok\n" }
}
my $c = '/***********************
* This is a C comment *
***********************/
#include <stdio.h>
/* first */
main() { printf("C"); }';
if $c ~~ m{( \/\* \N+? \*\/ )} {
if $0 eq "/* first */" { say "ok" }
}
if $c ~~ m{( \/\* [.|\n]+? \*\/ )} {
my $lines = $0;
if $lines ~~ /comment/ { say "ok" }
}
36
/e 修飾子の廃止
Perl 6
Perl 5
s/pattern/code/e
s/pattern/{code}/
sub cm2inch {
my ($cm) = @_;
sprintf('%.01f-inch', $cm / 6.5);
}
my $floppy = "3.5-inch FDD";
if ($floppy =~ s/(\d+\.\d+)-inch/{ sprintf('%.02f-cm',
$1 * 6.5) }/ex) {
if ($floppy eq "22.75-cm FDD") { print "ok\n" }
if ($floppy =~ s/(\d+\.\d+)-cm/{ &cm2inch($1) }/ex) {
if ($floppy eq "3.5-inch FDD") { print "ok\n" }
}
}
sub cm2inch($cm) {
sprintf('%.01f-inch', $cm / 6.5);
}
my $floppy = "3.5-inch FDD";
if $floppy ~~ s/(\d+\.\d+)-inch/{ sprintf('%.02f-cm',
$0 * 6.5) }/ {
if $floppy eq "22.75-cm FDD" { say "ok" }
if $floppy ~~ s/(\d+\.\d+)-cm/{ &cm2inch($0) }/ {
if $floppy eq "3.5-inch FDD" { say "ok" }
}
}
Cf. Acme::Hyde(単位変換) on CPAN
37
新しい修飾子の書き方
Perl 5
Perl 6
m/pattern/i
m:i/pattern/
m/pattern/g
m:e/pattern/
s/pattern/replace/ig
s:i:e/pattern/replace/
my $imas = "とかしつくして";
my $imas = "とかしつくして";
if ($imas =~ s/し/ち/g) {
if $imas ~~ s:g/し/ち/ {
if ($imas eq "とかちつくちて") {
または
m:each/pattern/
if $imas eq "とかちつくちて" {
print "ok\n";
say "ok";
}
}
または m:ignorecase/pattern/
}
}
38
空白マッチ修飾子:w
Perl 6
Perl 5
m/foo\s+bar/
m/\s*foo\s+bar\s*/
m:w/foo bar/
m:w/ foo bar /
Perl6 では、スペースとコメントが自由に挿入できるモード/x がデフォルトになったため
正規表現中にスペースを書いても無視されてしまう...
 whitespaceを有効にする空白マッチ修飾子:w
my $str = "begin: foo
bar \t baz \n end";
if ($str =~ m/(foo \s+ bar)/x) {
if ($1 eq "foo
my $str = "begin: foo
bar \t baz \n end";
if $str ~~ m:w/(foo bar)/ {
bar") { print "ok\n" }
if $0 eq "foo
bar" { say "ok" }
}
}
if ($str =~ m/(\s* foo \s+ bar \s*)/x) {
if $str ~~ m:w/( foo bar )/ {
if ($1 eq " foo
}
bar \t ") { print "ok\n" }
if $0 eq " foo
bar \t " { say "ok" }
}
39
4. キャプチャ
40
キャプチャ括弧(…)と後方参照
Perl 6
Perl 5
(…),\1,\2,\3…
(…),$0,$1,$2…
括弧(…)でキャプチャして、同じ正規表現内で後方参照する
my $str = "abracadabra";
my $str = "abracadabra";
if ($str =~ /(a)br\1c/) { print "ok\n" }
if $str ~~ /(a)br$0c/ { say "ok" }
if ($str =~ /(ab)racad$1ra/) { print "ok\n" }
if $str ~~ /(ab)racad$0ra/ { say "ok" }
if ($str =~ /(a)(b)r$1c$2d$2$2ra/) {
if $str ~~ /(a)(b)r$0c$0d$0$1ra/ {
print "ok\n" ;
say "ok" ;
}
}
if ($1 eq "a") { print "ok\n" }
if ($0 eq "a") { say "ok" }
if ($2 eq "b") { print "ok\n" }
if ($1 eq "b") { say "ok" }
【覚え方】
日本円\廃止
 ドル$決済でゼロスタート
(スクラップ&スクラップ)
41
キャプチャを伴わない括弧 […]
Perl 6
Perl 5
(?:pattern)
[pattern]
my @domain = ( "shibuya.pm.org",
"shibuya.pl"
,
"shibuyajs.org" ,
);
for (@domain) {
if (/^(\w+)(?:\.|-)?(js|pm|pl)(?:.org)?$/)
{
print "Hello, $1 $2 !\n";
}
}
my @domain = ( "shibuya.pm.org",
"shibuya.pl"
,
"shibuyajs.org" ,
);
for @domain {
if /^(\w+) [\.|-]? (js|pm|pl) [.org]? $/ {
say "Hello, $0 $1 !";
}
}
ドメイン名からコミュニティ名を判断し "Hello, shibuya pm !" と挨拶する
42
5. メタキャラクタ
43
文字クラスの定義 <[a-z]>
Perl 6
Perl 5
[abc]
[a-z]
[^xyz]
[B-Y]
<[abc]>
<[a-z]>
<-[xyz]>
< <[A-Z]> - <[AZ]> >
my @files = ("Jcode.pm", "Encode.pm", "jcode.pl");
my @files = ("Jcode.pm", "Encode.pm", "jcode.pl");
foreach (@files) {
for @files {
if / ( [J|En|j] code \. p<[ml]> ) / {
if (/ ( (?:J|En|j) code \. p[ml]) /x ) {
if $_ eq $0 { say "ok" }
if ($_ eq $1) { print "ok\n" }
}
}
}
}
"Jcode.pm", "Encode.pm", "jcode.pl" のどれにもマッチする正規表現
44
文字クラスの定義 <[a-z]>
Perl 6
Perl 5
\x20
\s+
\.
[[:digit:]]
[[:upper:]]
[[:lower:]]
[[:alpha:]]
[[:alnum:]]
#
#
#
#
#
#
#
#
空白1文字
連続したスペース
ドット
[0-9]
[A-Z]
[a-z]
[A-Za-z]
[A-Za-z0-9]
$_ = "123 abc \t 456 ijk \t 789 XYZ";
if (/ ([0-9]+) \ ([A-Za-z]+) /x) {
if ($1 eq "123" && $2 eq "abc") { print "ok\n" }
}
if (/ ([A-Za-z]+) \s+ ([0-9]+) /x) {
if ($1 eq "abc" && $2 eq "456") { print "ok\n" }
}
<space>
<ws>
<dot>
<digit>
<upper>
<lower>
<alpha>
<alnum>
$_ =
if /
if
}
if /
if
}
#
#
#
#
#
#
#
#
空白1文字
連続したスペース
ドット
※ <lt>, <gt> なども
数字
英大文字
英小文字
アルファベット
アルファベットと数字
"123 abc \t 456 ijk \t 789 XYZ";
(<digit>+) \ (<alpha>+) / {
$0 eq "123" && $1 eq "abc" { say "ok" }
(<alpha>+) <ws> (<digit>+) / {
$0 eq "abc" && $1 eq "456" { say "ok" }
※Perl 6 Specs よりサンプル作成
45
変数展開 <$var>
Perl 5
Perl 6
/ $var /x
/ <$var> /
my $var = "(This|That) is a (pen|book)";
my $var = "(This|That) is a (pen|book)";
my $text1 = "This is a pen";
my $text1 = "This is a pen";
my $text2 = "That is a book";
my $text2 = "That is a book";
if ($text1 =~ /$var/) {
if ($text1 ~~ m:w/<$var>/) {
say "ok";
print "ok\n";
}
}
if ($text2 =~ /$var/) {
if ($text2 ~~ m:w/<$var>/) {
say "ok";
print "ok\n";
}
}
※Perl 6 Specs よりサンプル作成
46
文字列 <'string'> のリテラル展開
Perl 5
Perl 6
\Q$var\E
$var
\Qstring\E
<'string'>
\$\Qstring\E
<'$string'>
my $err = "Can't locate Boofy.pm in \@INC";
my $soozy = "Boofy.pm";
if ($err =~ /\Q$soozy\E/x) {
print "ok\n";
}
if ($err =~ /\@INC/x) {
print "ok\n";
}
my $err = "Can't locate Boofy.pm in \@INC";
my $soozy = "Boofy.pm";
if $err ~~ /$soozy/ {
say "ok";
}
if $err ~~ /<'@INC'>/ {
say "ok";
}
※Perl 6 Specs よりサンプル作成
47
文字列配列 @str のリテラル展開
Perl 6
Perl 5
$target ~~ / (?:
\Q$str[0]\E |
\Q$str[1]\E | … ) /x
my @str = ("orz", "OTL", "_|~|-O");
my $food = "pasta mista, peperini,
capellini tagliati,
orzi piccoli, stelline.";
if ($food =~ /(?: \Q$str[0]\E
| \Q$str[1]\E
| \Q$str[2]\E )/x)
{
print "ok\n";
}
$target ~~ / @str /
my @str = ("orz", "OTL", "_|~|-O");
my $food = "pasta mista, peperini,
capellini tagliati,
orzi piccoli, stelline.";
if $food ~~ / @str / {
say "ok";
}
※Perl 6 Specs よりサンプル作成
48
6. クロージャ
49
コードの実行 {code}
Perl 6
Perl 5
/pat(?{code})tern/
# 埋め込みコード
/pat{code}tern/
/pat(??{retcode})tern/
# 動的正規表現
/pat<{retcode}>tern/
どこでもクロージャ{...}
my $text = "pattern";
my $text = "pattern";
$text =~ m/pat(?{print "ok\n"})tern/;
$text ~~ m/pat{say "ok"}tern/;
if ($text =~ m/pat(??{lc("TER")})n/) {
if $text ~~ m/pat<{lc("TER")}>n/ {
say "ok";
print "ok\n";
}
}
※Perl 6 Specs よりサンプル作成
50
マッチ失敗 {fail}
Perl 5
Perl 6
/ (...) {fail} /
【例】 IPアドレスをチェックする正規表現
my $x = qr/(25[0-5]|(?:2[0-4]|1[0-9]|[1-9])?[0-9])/;
for (0..255) {
/^($x)$/;
}
my $addr = "192.168.1.33";
if ($addr =~ /^($x\.$x\.$x\.$x)$/) {
print "ok\n";
}
rule x { (\d+) };
rule x1 { (\d+) {fail if $0 > 255} };
rule x2 { (\d+) {$0 < 256 or fail} };
rule x3 { (\d+) <?{ $0 < 256}> };
my $addr = "192.168.1.33";
if $addr ~~ /<x>\.<x>\.<x>\.<x>/ {
say "ok";
}
[これは便利] 正規表現のクロージャ内で fail を呼ぶと,現在のキャプチャ内のマッチに失敗させることができる。
これを応用すると、正規表現中に複雑な計算式やプログラムを組み込んでパターンマッチさせられる。
※Perl 6 Specs よりサンプル作成
51
繰り返し範囲 **{n..m}
Perl 6
Perl 5
*
# 0回以上の繰り返しにマッチ
*
# 0回以上の繰り返しにマッチ
+
# 1回以上の繰り返しにマッチ
+
# 1回以上の繰り返しにマッチ
?
# 0回または1回の繰り返しにマッチ
?
# 0回または1回の繰り返しにマッチ
{n}
# n回の繰り返しにマッチ
**{n}
# n回の繰り返しにマッチ
{n,}
# 少なくともn回の繰り返しにマッチ
**{n..*} # 少なくともn回の繰り返しにマッチ
{n,m}
# n回以上m回以下の繰り返しにマッチ
**{n..m} # n回以上m回以下の繰り返しにマッチ
クロージャを使って繰り返し範囲の回数をスマートに実現
$_ = “192.168.1.300";
$_ = “192.168.1.300";
/(\d+\.\d+\.\d+\.\d+)/;
/(\d+\.\d+\.\d+\.\d+)/;
/((?:\d{1,3}\.){3}\d{1,3})/;
/((?:\d**{1..3}\.)**{3}\d**{1..3})/;
この繰り返しの構文は何回か仕様が変わっていて、以前は<n,m>という書き方でしたが
現在のクロージャを使った形 **{n..m} に落ち着いてきています。
※Perl 6 Specs よりサンプル作成
52
7. ルール
53
正規表現のライブラリ化
Perl 6 Rules
grammar Perl6::Rule {
rule pattern { <term>+? }
rule term {
<comment> | <alternation> | <non_alternation>
}
rule comment { \# \N* }
rule alternation {
<non_alternation> \| <term>+?
}
rule non_alternation { … }
}
$source_code ~~ / <Perl6::Rule.pattern> /;
54
Example
Target strings
# lib/MyProject/Test.pm
http://search.cpan.org/~ingy/Test-Base/lib/Test/Base.pm
Perl 6 code
grammar Test::Base::Spec {
package MyProject::Test;
use Test::Base -Base;
use MyProject;
…
package MyProject::Test::Filter;
use Test::Base::Filter -base;
sub my_filter {
return MyProject->do_something(shift);
}
rule spec { <block>* }
# t/sample.t
use MyProject::Test;
rule head {
<block_delim> [ <sp>+ <name> ]? \n
}
rule block {
<head>
<comment>
<section>*
}
plan tests => 1 * blocks;
rule comment {
[ <!section_delim> <line> ]*
}
run_is input => 'expected';
sub local_filter {
s/my/your/;
}
rule section {
<section_delim>
<sp>+ <name>
<sp>+ [ <filter> <sp>+ ]*
[ ':' <data> \n | \n <chunk> ]
}
__END__
=== Test one (the name of the test)
--- input my_filter local_filter
my
input
lines
--- expected
expected
output
=== Test two
This is an optional description
of this particular test.
--- input my_filter
other
input
lines
--- expected
other expected
output
rule block_delim
{ === }
rule section_delim { --- }
rule
rule
rule
rule
line {
name {
data {
filter
\N* \n }
\N* }
\N* }
{ \S+ }
rule chunk {
[ <!block_delim> <!section_delim> <line> ]*
}
}
55
8. Perl5互換の正規表現
56
Perl 5 互換の正規表現
Perl 5
Perl 6
m/old_pattern/
m/old_pattern/i
m/(?i)old_pattern/
m:perl5/old_pattern/
m:perl5:i/old_pattern/
m:perl5/(?i)old_pattern/
my $var = "(This|That) is a (pen|book)";
my $var = "(This|That) is a (pen|book)";
my $text1 = "This is a pen";
my $text1 = "This is a pen";
my $text2 = "That is a book";
my $text2 = "That is a book";
if ($text1 =~ /$var/) {
if ($text1 ~~ m:w/<$var>/) {
say "ok";
print "ok\n";
}
}
if ($text2 =~ /$var/) {
if ($text2 ~~ m:w/<$var>/) {
say "ok";
print "ok\n";
}
}
Perl 5 の正規表現でも書けるので、ご安心を
57
Named capture など
まだまだ紹介しきれない
便利な機能がいっぱい!
58
さらに詳しく
59
参考URL
 Perl 6 rules - Wikipedia
 http://en.wikipedia.org/wiki/Perl_6_rules
 perl6: Apocalypse 5: Pattern Matching
(Larry Wall)
 http://dev.perl.org/perl6/doc/design/apo/A05.html
 perl6: Synopsis 5: Regexes and Rules
(Damian Conway)
 http://dev.perl.org/perl6/doc/design/syn/S05.html
 Perl 6 FAQ - Regexes and Grammars
 http://www.programmersheaven.com/2/Perl6-FAQ-Regex
 Perl6::Rules - Implements (most of) the Perl 6 regex syntax
 http://search.cpan.org/~dconway/Perl6-Rules/Rules.pm
 日本語
 Perl6 Rules(新たな正規表現)
 http://www9.ocn.ne.jp/~ymt/perl6/rules.html
60
Software Design 2007年2月号
http://labs.cybozu.co.jp/blog/takesako/2007/01/perl6software_design_20072.html
61
62
63
巻末リファレンスの正しい読み方
64
Enjoy Perl 6
Have fun!
s/ Perl5 Regular Expression /
Perl6 Regex and Rules
/mixes;
65
ご清聴ありがとうございました
66