我刚刚安装了Perl 5.18,我收到很多这样的警告,
given is experimental at .\[...].pl line [...].
when is experimental at .\[...].pl line [...].
Smartmatch is experimental at C:/strawberry/perl/site/lib/[...] line [...].
Run Code Online (Sandbox Code Playgroud)
看看这些警告 - 我从未在任何地方听到过这些警告 - 我只能在两个地方找到这个警告,
Perl Delta仍然能够最大限度地提及这些功能正在发生的事情,它被埋在吊舱中的一半,
在v5.10.0中添加并在v5.10.1中进行了重大修订的智能匹配一直是一个常见的投诉点.尽管有许多方法可用,但它也证明了Perl的用户和实现者都存在问题和困惑.关于如何最好地解决问题,已经提出了许多建议.很明显,smartmatch几乎肯定会在将来改变或消失.不建议依赖其当前行为.现在,当解析器看到〜,给定或何时发出警告.
我对过去10年中Perl最显着的变化如何被拉动感到困惑.我已经开始使用given,when以及smartmatch所有地方.还有关于这些未来的更多信息吗?怎么有人发现它们"令人困惑?" 这些功能如何变化?是否有计划使用模块实现这些功能?
源过滤器是坏的并且不应该在生产代码中使用是"常识" .
在回答类似但更具体的问题时,我找不到任何好的参考资料,清楚地解释了为什么过滤器是坏的以及何时可以安全使用.我想现在是时候创造一个了.
我已经安装了Active Perl(v5.14.2,64位,适用于Windows),并且我的代码包含use Switch;错误导致失败Can't locate Switch.pm in @INC (@INC contains: C:/Perl64/site/lib C:/Perl64/lib .) at myfilename.pl line 3..
switch.pm从较旧的32位安装复制修复了问题,但我不明白.switch.pm在此期间已被弃用?
我有一个我想测试的值($ field).阅读perl doc(http://perldoc.perl.org/Switch.html#Allowing-fall-through),并认为我已将此钉住了.似乎没有,因为如果我通过'Exposure Bias',就没有输出,尽管'Exposure Bias Value'可以正常工作.它没有抛出任何错误,所以我不知道.
use Switch;
use strict; use warnings;
my $field = 'Exposure Bias';
switch($field){
case 'Exposure Bias' {next;}
case 'Exposure Bias Value' {print "Exp: $field\n";}
}
Run Code Online (Sandbox Code Playgroud)
更新
我似乎假装错了.如果匹配任何一种情况,我想用这个开关做的是打印运行.我认为接下来会将控制权传递给下一个案例的代码,但这是我的错误.
我如何对此进行编码,以便在第一种情况匹配时第二种情况下的代码运行?
工作方案
given($field){
when(['Exposure Bias','Exposure Bias Value']){print "Exp: $field\n";}
}
Run Code Online (Sandbox Code Playgroud) foreach my $f($query->param) {
foreach my $v($query->param($f)) {
switch($f) {
case 'a' {
switch($v) {
case 1 { code1; }
case 2 { code2; }
case 3 { code3; }
}
case 'b' {
switch($v) {
case 1 { code4; }
case 2 { code5; }
}
case 'c' {
switch($v) {
case 1 { code6; }
case 2 { code7; }
case 3 { code8; }
case 4 { code9; }
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud) 在我写的最后一个脚本中,我需要一个类似于switch语句行为的行为.在Perl中简单搜索一个等价物导致我use Switch.一开始,一切都很好并且正常工作,直到所有内容都崩溃了并且描述性错误(它发生在具有正则表达式的情况的switch语句中,但奇怪的是它并没有发生在其他类似的switch语句中).
编辑:崩溃的代码看起来像这样:
switch ($var) {
case /pattern1/ {...}
case /pattern2/ {...}
...
else {...}
}
Run Code Online (Sandbox Code Playgroud)
这导致我放弃使用Switch.pm和寻找替代方案.
我发现,given和for-when,当然总是有简单的,有点幼稚if-elsif-else.
Switch.pm这么不稳定?given与for-when具有类似的结构,但我想有区别(因为两者存在).它是什么?if-elsif-else明显慢于其他选项?