Perl 6 中的模式匹配

模式匹配

my $name = "twostraws";

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

同時檢查名字和密碼

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 "你是誰?"                }
}

使用單個元組

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

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

部分匹配

# 你只關心某些感興趣的值,不關心其它值装哆,使用 `*` 號或 `$` 來代表 "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?"         }
}

匹配計算型元組

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 "你有活力有時間萍桌,但是沒錢"  }
  when 18 ..^ 70  { say "你有活力有錢凌简,但是沒時間"  }
  default         { say "你有時間和金錢,但是沒活力"}
}

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

my $age = 36;
when $age ~~ 0 ..^ 18  { say "你有活力有時間藕施,但是沒錢"  } 
when $age ~~ 18 ..^ 70 { say "你有活力有錢凸郑,但是沒時間"  }
default                { say "你有時間和金錢,但是沒活力"}

使用 contains 方法

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

匹配元組中的范圍

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

枚舉

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

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

關聯(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;     # 使用正則表達式
.say when $_.chars > 12 for @celebrities;  # 調(diào)用方法
.say when /^Michael/ and $_.chars >12 for @celebrities; # 復合條件
最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末植袍,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子氛魁,更是在濱河造成了極大的恐慌厅篓,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,919評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件或链,死亡現(xiàn)場離奇詭異档押,居然都是意外死亡,警方通過查閱死者的電腦和手機叼耙,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,567評論 3 392
  • 文/潘曉璐 我一進店門掀淘,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人倾贰,你說我怎么就攤上這事拦惋。” “怎么了首尼?”我有些...
    開封第一講書人閱讀 163,316評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長迎捺。 經(jīng)常有香客問我查排,道長,這世上最難降的妖魔是什么岖瑰? 我笑而不...
    開封第一講書人閱讀 58,294評論 1 292
  • 正文 為了忘掉前任蹋订,我火速辦了婚禮刻伊,結果婚禮上,老公的妹妹穿的比我還像新娘娃圆。我一直安慰自己,他們只是感情好撩鹿,可當我...
    茶點故事閱讀 67,318評論 6 390
  • 文/花漫 我一把揭開白布节沦。 她就那樣靜靜地躺著础爬,像睡著了一般。 火紅的嫁衣襯著肌膚如雪叫搁。 梳的紋絲不亂的頭發(fā)上供炎,一...
    開封第一講書人閱讀 51,245評論 1 299
  • 那天音诫,我揣著相機與錄音,去河邊找鬼梨撞。 笑死,一個胖子當著我的面吹牛卧波,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播嗜侮,決...
    沈念sama閱讀 40,120評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼顷霹!你這毒婦竟也來了?” 一聲冷哼從身側響起淋淀,我...
    開封第一講書人閱讀 38,964評論 0 275
  • 序言:老撾萬榮一對情侶失蹤炭臭,失蹤者是張志新(化名)和其女友劉穎袍辞,沒想到半個月后搅吁,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,376評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡肚豺,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,592評論 2 333
  • 正文 我和宋清朗相戀三年吸申,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片截碴。...
    茶點故事閱讀 39,764評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡隐岛,死狀恐怖瓷翻,靈堂內(nèi)的尸體忽然破棺而出割坠,到底是詐尸還是另有隱情妒牙,我是刑警寧澤敢朱,帶...
    沈念sama閱讀 35,460評論 5 344
  • 正文 年R本政府宣布拴签,位于F島的核電站蚓哩,受9級特大地震影響上渴,放射性物質(zhì)發(fā)生泄漏稠氮。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,070評論 3 327
  • 文/蒙蒙 一赃份、第九天 我趴在偏房一處隱蔽的房頂上張望锹锰。 院中可真熱鬧,春花似錦恃慧、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,697評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽善延。三九已至城侧,卻和暖如春易遣,著一層夾襖步出監(jiān)牢的瞬間嫌佑,已是汗流浹背侨歉。 一陣腳步聲響...
    開封第一講書人閱讀 32,846評論 1 269
  • 我被黑心中介騙來泰國打工揩魂, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人火脉。 一個月前我還...
    沈念sama閱讀 47,819評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像畸颅,于是被迫代替她去往敵國和親方援。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,665評論 2 354

推薦閱讀更多精彩內(nèi)容