Perl 给定/何时存在什么样的整洁用例?
Perl 5.10引入了一个适当的开关构造,它带有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/") {
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};
}
}