Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl 给定/何时存在什么样的整洁用例?_Perl_Switch Statement - Fatal编程技术网

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

Perl 给定/何时存在什么样的整洁用例?,perl,switch-statement,Perl,Switch Statement,Perl 5.10引入了一个适当的开关构造,它带有given/when,似乎是一个强大的工具 然而,目前,perldocperlsyn缺乏一些好的例子 我最近发现它很方便的一个例子是与文件测试操作符一起使用它: given (-d "foo/bar/") { when (1) { ... } # defined is wrong as -d returns '' on a file. default { ... } } 或者: given ("foo/bar/") {

Perl 5.10引入了一个适当的开关构造,它带有
given/when
,似乎是一个强大的工具

然而,目前,
perldocperlsyn
缺乏一些好的例子

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

given (-d "foo/bar/") {
    when (1) { ... } # defined is wrong as -d returns '' on a file.
    default { ... }
}
或者:

given ("foo/bar/") {
    when (-d) { ... }
    default { ... }
}
对我来说,尤其是第一个版本看起来比if-else构造或使用三元运算符更好,这取决于测试结果,我需要在这两种情况下执行操作

这让我想知道,除了回到智能匹配和避免过长的if-elsif-elsif-elsif-else结构之外,还有什么看起来更整洁的呢

我有一种预感,给定/何时可以使人变得聪明而不失清晰,但我没有任何好的例子

但有一件事让我惊讶,那就是您也可以嵌套构造:

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" } }
在回答Zaid的问题时,我得到了一个穷人的yacc,其主循环搜索正则表达式数组以获得第一个匹配:

while (<>) {
  given($_) {
    when (@{[ map $pattern{$_}, @expect ]}) {}
    default {
      die "$0: line $.: expected " . join("|" => @expect) . "; got\n$_";
    }
  }
}
不知道下面是一个简洁的用例,还是仅仅是Perl语言谱系的一个小贴士:)

如果您查看
$\uuu
中有“it”,那么它工作得特别好(IMHO)

上述操作由智能匹配操作员执行,
given/when
依赖于此。下面是如何编写Time类以使我的示例正常工作:

{
    package TheTime;
    use DateTime;
    use overload '~~' => '_check_hour', fallback => 1;

    our %day_time = (
        morning   => [0..11],
        afternoon => [12..17],
        evening   => [18..23],
    );

    sub of_day {
        my $class = shift;
        bless {
            dt => DateTime->now,
        }, $class;
    }

    sub is_work_day { shift->{dt}->day_of_week ~~ [1..5] }
    sub is_friday   { shift->{dt}->day_of_week == 5      }

    sub _check_hour {
        my ($self, $greeting) = @_;
        $self->{dt}->hour ~~ $day_time{$greeting};
    } 
}
/I3az/


另请看我最近写的这篇博文:

你可能想使用
-f
-z
-d
,和
-o
来避免调用同一个文件
-e
上的
stat
。有关更多信息,请参阅。实际上,使用缓存表单通常是一个好主意。不过,我不想把这个例子和不相关的东西过分复杂化。不管怎样,它很少影响性能…
-d
包含
-e
-f
包含
-e
,除非
,否则没有理由测试
-e
-f&&-d
,它不会改变任何东西,只是假设在这种情况下,如果
-e
,那么它是特殊的。@Axeman:虽然
-d
-f
确实包含
-e
,但重点是演示给定的/何时嵌套以及它如何使一些东西变得非常整洁。我承认这不是最好的例子,这就是我要求更多的原因:)而且,从逻辑上讲,同时使用
-e
-f
-d
,是有意义的,因为这正是区分“没有这样的文件”(任何类型)和“特殊文件”(套接字、符号链接等)的情况在学习Perl的智能匹配一章中有几个例子:给定的
语句有点烦人。是否有理由
while
不能用作主题化工具?
# things todo (or should have done!) at this time of the day:

given (TheTime->of_day) {

    when ('morning') {
        breakfast();
        make_packed_lunch() if $_->is_work_day;
    }

    lunch() when 'afternoon';

    when ('evening') {
        goto_pub() if $_->is_friday;
        dinner();
    }

    default { say "Should be sleeping if its " . $_->{dt}->ymd }
}
{
    package TheTime;
    use DateTime;
    use overload '~~' => '_check_hour', fallback => 1;

    our %day_time = (
        morning   => [0..11],
        afternoon => [12..17],
        evening   => [18..23],
    );

    sub of_day {
        my $class = shift;
        bless {
            dt => DateTime->now,
        }, $class;
    }

    sub is_work_day { shift->{dt}->day_of_week ~~ [1..5] }
    sub is_friday   { shift->{dt}->day_of_week == 5      }

    sub _check_hour {
        my ($self, $greeting) = @_;
        $self->{dt}->hour ~~ $day_time{$greeting};
    } 
}