Perl 6 中的模式匹配

模式匹配

my $name = "twostraws";

given $name {
  when "bilbo"      { say "Hello, Bilbo Baggins!"}
  when "twostraws"  { say "Hello, Paul Hudson!"  }
  default           { say "身份驗(yàn)證失敗"           }
}

同時(shí)檢查名字和密碼

my $name     = "twostraws";
my $password = "fr0st1es";

given ($name, $password) {
  when ("bilbo", "bagg1n5")      { say "Hello, Bilbo Baggins!" }
  when ("twostraws", "fr0st1es") { say "Hello, Paul Hudson!"   }
  default                        { say "你是誰?"                }
}

使用單個(gè)元組

my $authentication = ("twostraws", "fr0st1es");

given $authentication {
  when ("bilbo", "bagg1n5")      { say "Hello, Bilbo Baggins!" }
  when ("twostraws", "fr0st1es") { say "Hello, Paul Hudson!"   }
  default                        { say "你是誰?"                }
}

部分匹配

# 你只關(guān)心某些感興趣的值,不關(guān)心其它值,使用 `*` 號或 `$` 來代表 "any value is fine"
my $authentication = ("twostraws", "fr0st1es", "127.0.0.1");
given $authentication {
  when ("bilbo", "bagg1n5", *)      { say "Hello, Bilbo Baggins!"}
  when ("twostraws", "fr0st1es", $) { say "Hello, Paul Hudson!"  }
  default                           { say "Who are you?"         }
}

只匹配元組的一部分

# 但仍然想知道其它部分是什么
my $authentication = ("twostraws", "fr0st1es");
given $authentication {
  when ("bilbo", *)     { say "Hello, Bilbo Baggins!" }
  when ("twostraws", *) { say "Hello, Paul Hudson: your password was $_!" }
  default               { say "Who are you?"         }
}

匹配計(jì)算型元組

sub fizzbuzz(Int $number) returns Str {
    given ($number % 3 == 0, $number % 5 == 0) {
      when (True, False)  { return "Fizz"     }
      when (False, True)  { return "Buzz"     }
      when (True, True)   { return "FizzBuzz" }
      when (False, False) { return $number.Str}
    }
}

say fizzbuzz(15);

遍歷元組

my $twostraws = ("twostraws", "fr0st1es");
my $bilbo = ("bilbo", "bagg1n5");
my $taylor = ("taylor", "fr0st1es");
my @users = $twostraws, $bilbo, $taylor;

for @users -> $user {
    say $user[0];
}

使用 when 匹配元組中的指定值

my $twostraws = ("twostraws", "fr0st1es");
my $bilbo = ("bilbo", "bagg1n5");
my $taylor = ("taylor", "fr0st1es");
my @users = $twostraws, $bilbo, $taylor;

say "User twostraws has the password fr0st1es" when ("twostraws", "fr0st1es") for @users;

# 打印密碼為指定值的用戶
say "User $_[0] has password \"fr0st1es\"" when (*, "fr0st1es") for @users;

匹配范圍

my $age = 36;

given $age {
  when 0 ..^ 18   { say "你有活力有時(shí)間,但是沒錢"  }
  when 18 ..^ 70  { say "你有活力有錢,但是沒時(shí)間"  }
  default         { say "你有時(shí)間和金錢,但是沒活力"}
}

when 可以配合智能匹配操作符 ~~ 單獨(dú)使用

my $age = 36;
when $age ~~ 0 ..^ 18  { say "你有活力有時(shí)間,但是沒錢"  } 
when $age ~~ 18 ..^ 70 { say "你有活力有錢,但是沒時(shí)間"  }
default                { say "你有時(shí)間和金錢,但是沒活力"}

使用 contains 方法

my $age = 36;
when (0 ..^ 18).contains($age)  { say "你有活力有時(shí)間,但是沒錢"  } 
when (18 ..^ 70).contains($age) { say "你有活力有錢,但是沒時(shí)間"  }
default                         { say "你有時(shí)間和金錢,但是沒活力"}

匹配元組中的范圍

my $user = ("twostraws", "fr0st1es", 36);
given $user {
  my $name = $user[0];
  when ($name, *, 0 ..^ 18)  { say "$name 有活力有時(shí)間,但是沒錢"  } 
  when ($name, *, 18 ..^ 70) { say "$name 有活力有錢,但是沒時(shí)間"  }
  when ($name, *, *)         { say "$name 有時(shí)間和金錢,但是沒活力" }
}

枚舉

enum WeatherType <Cloudy Sunny Windy>;
my $today = WeatherType::Cloudy;
given $today {
  when WeatherType::Cloudy { say "多云" }
  when WeatherType::Sunny  { say "晴天" }
  when WeatherType::Windy  { say "有風(fēng)" }
}

# 使用 if 語句
if $today ~~ WeatherType::Cloudy { say "多云" }

關(guān)聯(lián)值

enum WeatherType  (
    Cloudy => 100,
    Sunny  => 50,
    Windy  => 30
);

my $today = WeatherType::Windy;
given $today {
  when WeatherType::Cloudy { say 20*Cloudy }
  when WeatherType::Sunny  { say 10*Sunny  } 
  when WeatherType::Windy  { say 12*Windy  }
}

when 從句

my @numbers = 1..10;
.say when $_ % 2 == 1 for @numbers;

my @celebrities = "Michael Jackson", "Taylor Swift", "MichaelCaine", "Adele Adkins", "Michael Jordan";
.say when /^Michael/ for @celebrities;     # 使用正則表達(dá)式
.say when $_.chars > 12 for @celebrities;  # 調(diào)用方法
.say when /^Michael/ and $_.chars >12 for @celebrities; # 復(fù)合條件
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容