Perl 6 中的模式匹配

作者: 焉知非鱼 | 来源:发表于2016-04-27 18:17 被阅读39次

模式匹配

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 "多云" }

关联值

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;  # 调用方法
.say when /^Michael/ and $_.chars >12 for @celebrities; # 复合条件

相关文章

  • 模式匹配和 Unpacking

    模式匹配和 Unpacking 当在 Perl 6 中讨论模式匹配时,人们通常会考虑正则表达式或 Grammar。...

  • Perl 6 中的模式匹配

    模式匹配 同时检查名字和密码 使用单个元组 部分匹配 只匹配元组的一部分 匹配计算型元组 遍历元组 使用 when...

  • Perl 6 中的智能匹配

    智能匹配 这儿有一个标准 Perl 6(即在你的编译单元开始的时候所生效的 Perl 方言) 的智能匹配表格。智能...

  • 【perl】正则表达式(二)

    一、Perl正则表达式的形式 1、模式匹配 得到“是否匹配”的结果,无其他操作——找pattern 形式:m代表m...

  • Perl 6 中的冒号

    Perl 6 Colons 在 Perl 6 中到处都是冒号, 我搜集了你在 Perl 6 中使用冒号的所有方式:...

  • Perl 6 - 正则替换

    想把 Desgin Perl 6 中的 pod/html 转为 Markdown 格式, Perl 6 的 po...

  • Typed hashes in Perl 6

    Typed hashes in Perl 6 在 Perl 6 中, 你可以通过指定变量的类型来限制变量容器的内容...

  • Perl 6 模块分析 - 并发查找文件

    第一次分析 Perl 6 中的模块, 学到很多东西。perl6-concurrent-file-find 是使用 ...

  • Perl 6 中的 multi

    Perl 6 中的 multi (函数) multi 声明符 Perl 6 允许你使用同一个名字但是不同签名写出几...

  • Perl 6 .rotor - 列表操作之王

    Perl 6 .rotor - The King of List Manipulation 对于 Perl 6 程...

网友评论

    本文标题:Perl 6 中的模式匹配

    本文链接:https://www.haomeiwen.com/subject/orbcrttx.html