昨日の続きです。

The 43rd Tokyo Motor Show 2013 PENTAX K-3 184 (11248339763)
 等価演算子は、Perl 5では==(数値として等しい)、eq(文字列として等しい)の2つでしたが、Perl 6では~~(スマートマッチ)、===(オブジェクトとして同一)、eqv(同じアトリビュートを持つオブジェクト)、=:=(同じコンテナを持つ2つの変数。:=(バインド)演算子で結合された2つの変数の場合真を返す)という4つが追加されました。
eqv, ===, =:=, etc.

 ===とeqvと=:=は難しいので~~だけ研究していいですか。

 ~~は、左のものは右のものの仲間である、ということを伝えるものです。
 最初は、渡された整数が1と10の範囲であれば真、間違っていれば偽を返します。

#! /usr/bin/env perl6
# smama_1.p6 -- Perl 6のスマートマッチの練習(リストの一員か)

sub MAIN (Int $i) {
 say "\$i ~~ 1..10【{ $i ~~ 1..10 }】"
}

[sample]$ ./smama_1.p6 # 引数を渡さないと怒られる
Usage:
./smama_1.p6
[sample]$ ./smama_1.p6 3.2 # 整数を渡さないと怒られる
Usage:
./smama_1.p6
[sample]$ ./smama_1.p6 1 # 1は1と10の間
$i ~~ 1..10【True】
[sample]$ ./smama_1.p6 4
$i ~~ 1..10【True】
[sample]$ ./smama_1.p6 15
$i ~~ 1..10【False】

 便利ですね!

 右辺にハッシュを渡すと、キーのリストに一致するかを調べます。

#! /usr/bin/env perl6
# smama_2.p6 -- Perl 6のスマートマッチの練習(ハッシュのキーの一員か)

sub MAIN (Str $s) {
 my %hash =
  foo => "Mr. foo",
  bar => "Ms. foo",
  baz => "M. baz",
 ;
 say "\$s ~~ %hash【{ $s ~~ %hash }】"
}

[sample]$ ./smama_2.p6 foo
$s ~~ %hash【True】
[sample]$ ./smama_2.p6 goo
$s ~~ %hash【False】

 右辺にIntやStringなどの型を渡すと、左辺がその型であるかを確かめます。

#! /usr/bin/env perl6
# smama_3.p6 -- Perl 6のスマートマッチの練習(型に合っているか)

sub MAIN (Any $s) {
 say "\$s ~~ Int【{ $s ~~ Int }】";
 say "\$s ~~ Str【{ $s ~~ Str }】";
 say "\$s ~~ Rat【{ $s ~~ Rat }】";
 say "\$s ~~ Real【{ $s ~~ Real }】";
}

[sample]$ ./smama_3.p6 foo
$s ~~ Int【False】
$s ~~ Str【True】
$s ~~ Rat【False】
$s ~~ Real【False】
[sample]$ ./smama_3.p6 56
$s ~~ Int【True】
$s ~~ Str【True】
$s ~~ Rat【False】
$s ~~ Real【True】
[sample]$ ./smama_3.p6 56/3
$s ~~ Int【False】
$s ~~ Str【True】
$s ~~ Rat【True】
$s ~~ Real【True】
[sample]$ ./smama_3.p6 56/7
$s ~~ Int【False】
$s ~~ Str【True】
$s ~~ Rat【True】
$s ~~ Real【True】
[sample]$ ./smama_3.p6 56.3
$s ~~ Int【False】
$s ~~ Str【True】
$s ~~ Rat【True】
$s ~~ Real【True】

 右辺に正規表現が来ると、それにマッチするか確かめます。つまり、Perl 5の=~は~~になりました〜〜

#! /usr/bin/env perl6
# smama_4.p6 -- Perl 6のスマートマッチの練習(正規表現にマッチするか)

sub MAIN (Str $s) {
 say "\$s ~~ /^前田/【{ $s ~~ /^前田/ }】";
}

[sample]$ ./smama_4.p6 前田敦子
$s ~~ /^前田/【前田】
[sample]$ ./smama_4.p6 篠田麻里子
Use of Nil in string context in sub MAIN at ./smama_4.p6 line 5
$s ~~ /^前田/【】
[sample]$ ./smama_4.p6 大前田英五郎
Use of Nil in string context in sub MAIN at ./smama_4.p6 line 5
$s ~~ /^前田/【】

 この場合マッチ演算子はTrueやFalseを返すのではなく、マッチしたらマッチ文字列を、マッチしなければNilを返すんですね。真偽を返したければ型変換もできます。

#! /usr/bin/env perl6
# smama_5.p6 -- Perl 6のスマートマッチの練習(正規表現にマッチするか、真偽編

sub MAIN (Str $s) {
 say "(\$s ~~ /^前田/).Bool【{ ($s ~~ /^前田/).Bool }】";
}

[sample]$ ./smama_5.p6 前田敦子
($s ~~ /^前田/).Bool【True】
[sample]$ ./smama_5.p6 山田菜々
($s ~~ /^前田/).Bool【False】

 でも、型変換しなくても、if条件にマッチ文字列を入れれば、マッチすれば真、マッチしなければ偽になりますね。

#! /usr/bin/env perl6
# smama_6.p6 -- Perl 6のスマートマッチの練習(正規表現にマッチするか、if条件編

sub MAIN (Str $s) {
 if $s ~~ /^前田/ {
  say "マッチ";
 } else {
  say "ノーマッチ";
 }
}

[sample]$ ./smama_6.p6 前田敦子
マッチ
[sample]$ ./smama_6.p6 前山田健一
ノーマッチ

 でも思った、Nilを含んでいるかどうかだとどうなんだろう。常に真になっていないといけない気がするが…。

#! /usr/bin/env perl6
# smama_7.p6 -- Perl 6のスマートマッチの練習(無とマッチするか

sub MAIN (Str $s) {
 if $s ~~ // {
  say "マッチ";
 } else {
  say "ノーマッチ";
 }
}

[sample]$ ./smama_7.p6 前田敦子
===SORRY!=== Error while compiling /Users/query1000/Dropbox/kpc/sample/./smama_7.p6
Null regex not allowed
at /Users/query1000/Dropbox/kpc/sample/./smama_7.p6:5
------> if $s ~~ //⏏ {

 そっか、//って書いちゃいけないんですね。