给定/何时存在什么样的整洁用例?

szb*_*int 10 perl switch-statement

Perl 5.10引入了一个合适的开关结构,given/when它似乎是一个强大的工具.

然而,目前perldoc perlsyn缺乏一些很好的例子.

最近我发现它很方便的一个案例是将它与文件测试操作符一起使用:

given (-d "foo/bar/") {
    when (1) { ... } # defined is wrong as -d returns '' on a file.
    default { ... }
}
Run Code Online (Sandbox Code Playgroud)

或者:

given ("foo/bar/") {
    when (-d) { ... }
    default { ... }
}
Run Code Online (Sandbox Code Playgroud)

对我来说,尤其是第一个版本看起来比if-else构造或使用三元运算符更好,当依赖于我需要在两种情况下执行操作的测试结果时.

这让我很奇怪,除了简单的回归智能匹配和避免过度if-elsif-elsif -...-其他结构之外,还有什么看起来很整洁?

我有一种预感,给予/什么时候可以聪明而不失清晰,但我没有任何好的例子.

令我惊讶的一件事是,你可以嵌套构造以及:

given ($filename) {
        when (-e) {
                when (-f) {
                        when (-z) { say "Empty file" }
                        default { say "Nonempty file" }
                }
                when (-d) {
                        when (-o) { say "Directory owned by me"}
                        default { say "Directory owned by someone else" }
                }
                default { say "Special" }
        }
        default { say "No such file or directory" } }
Run Code Online (Sandbox Code Playgroud)

Gre*_*con 3

在最近对 Zaid 问题Strategies to handle a file with multiplefixedformats 的回答中,我最终得到了一个穷人的 yacc,其主循环在正则表达式数组中搜索第一个匹配项:

while (<>) {
  given($_) {
    when (@{[ map $pattern{$_}, @expect ]}) {}
    default {
      die "$0: line $.: expected " . join("|" => @expect) . "; got\n$_";
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

在另一个问题中,David B 想要匹配多个正则表达式我的答案使用智能匹配来隐式循环正则表达式:

#! /usr/bin/perl

use warnings;
use strict;

use feature 'switch';

my @patterns = (
  qr/foo/,
  qr/bar/,
  qr/baz/,
);

for (qw/ blurfl bar quux foo baz /) {
  print "$_: ";
  given ($_) {
    when (@patterns) {
      print "hit!\n";
    }
    default {
      print "miss.\n";
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

  • “given”语句有点烦人。是否有“while”不能用作主题化器的原因? (2认同)