【问题标题】:switch vs. given vs. for-when vs. if-elsif-else in Perl在 Perl 中 switch vs. given vs. for-when vs. if-elsif-else
【发布时间】:2016-08-10 04:26:51
【问题描述】:

在我写的最后一个脚本中,我需要一个类似于 switch 语句行为的行为。在 Perl 中对等价物的简单搜索使我找到了use Switch。一开始,一切都很好并且正常工作,直到一切都因描述性不强的错误而崩溃(它发生在一个带有正则表达式的 switch 语句上,但奇怪的是它没有发生在其他类似的 switch 语句上)。

编辑:崩溃的代码看起来像这样:

switch ($var) {
    case /pattern1/ {...}
    case /pattern2/ {...}
    ...
    else {...}
}

这导致我放弃使用 Switch.pm 并寻找替代方案。

我找到了givenfor-when,当然总有直截了当的if-elsif-else

  1. 为什么Switch.pm 如此不稳定?
  2. 似乎givenfor-when 具有相似的结构,但我想还是有区别的(因为两者都存在)。它是什么?
  3. if-elsif-else 是否比其他选项慢很多?

【问题讨论】:

  • 这回答了我的第一个问题,谢谢!很高兴知道given 具有更多功能。
  • given 用于设置词法$_,但现在不存在了。 /// given 的表达式在标量上下文中计算,而 for 循环返回的标量。 /// 有些东西告诉我givenfor 中允许的流控制关键字有所不同。

标签: perl if-statement switch-statement


【解决方案1】:

Perl 的when 和智能匹配是实验性的,它们won't 成为没有向后不兼容更改的特性。你不应该使用这些。

Switch.pm 是一个源过滤器,因此当出现问题时它会产生不正确的错误消息。它也存在与智能匹配相同的问题。你不应该使用它。

所以,在您列出的选项中,只有一个是可行的,而且一点也不慢!

【讨论】:

  • 很好的答案。本能告诉我if-elsif-else 比用于案例处理的专用语句和模块慢,所以如果它一点也不慢,为什么还要首先创建这些模块?
  • 这只是语法。例如,given ($x) { when ([qw( a b c )]) { ... } when ([qw( d e f )]) { ... } ... }if (grep { $x eq $_ } qw( a b c )) { ... } elsif (grep { $x eq $_ } qw( d e f )) { ... } ...
猜你喜欢
  • 2023-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-09
  • 1970-01-01
  • 1970-01-01
  • 2012-03-05
  • 1970-01-01
相关资源
最近更新 更多