代码之家  ›  专栏  ›  技术社区  ›  librasteve

在perl6中为regex设置默认值的更简洁的方法

  •  6
  • librasteve  · 技术社区  · 7 年前

    要将例如mins-2拆分为单元名称和订单的组成部分,这就是我想要的

    sub split-order ( $string ) {
        my Str $i-s = '1';
        $string ~~ / ( <-[\-\d]>+ ) ( \-?\d? ) /;
        $i-s = "$1" if $1 ne '';
        return( "$0", +"$i-s".Int );
    }
    

    似乎perl6应该能够将其打包成更加简洁的措辞。我需要没有尾随数字的默认顺序为1。

    我可能有点懒,没有将行尾与$匹配。尽量避免返回Nil,因为这对调用者没有用处。

    有谁说得更好吗?

    2 回复  |  直到 7 年前
        1
  •  6
  •   moritz    7 年前

    使用good old怎么样 split ?

    use v6;
    
    sub split-order(Str:D $in) {
        my ($name, $qty) = $in.split(/ '-' || <?before \d>/, 2);
        return ($name, +($qty || 1));
    }
    
    say split-order('mins-2');  # (mins 2)
    say split-order('foo42');   # (foo 42)
    say split-order('bar');     # (bar 1)
    
        2
  •  5
  •   Elizabeth Mattijsen    7 年前

    这并不能准确地再现您的算法(尤其是不会产生负数),但我怀疑它更接近您实际想要实现的目标:

    sub split-order($_) {
        /^ (.*?) [\-(\d+)]? $/;
        (~$0, +($1 // 1));
    }