Perl如何重写given/when用法消除实验性特性警告
问题说明
- 运行环境:RHEL 8 系统,Perl 版本为 v5.26.3(x86_64-linux-thread-multi)
- 需求:替换属于实验性特性的
given/when语法,在不屏蔽警告的前提下重写代码,实现原有分支逻辑:对unsigned short类型整型变量$pl做匹配,取值0-4时分别输出A、B、C、D、E,其余取值输出Illegal,彻底消除实验性语法警告。
原自定义哈希方案报错原因
你之前尝试的哈希映射子例程方案逻辑本身可行,出现Number found where operator expected near 1报错的核心原因是:开启use strict的编译模式下,for $pl( 0..5 )中的循环变量$pl未用my声明,Perl解析器无法正确识别裸变量名,触发语法解析错误。另外对于当前仅做固定值输出的简单场景,存储子例程引用的写法属于过度设计,没必要使用。
可直接使用的改写方案
以下三种方案均完全兼容Perl 5.26版本,不依赖任何实验性特性,无运行警告,逻辑与原代码完全一致。
方案1:数组查表(推荐,适配当前连续取值场景)
由于匹配值是0-4的连续整数,数组查表的写法性能最高、代码最简洁:
# 数组索引对应$pl的取值,元素为对应输出内容 my @pl_map = qw(A B C D E); if ($pl >= 0 && $pl <= $#pl_map) { print $pl_map[$pl]; } else { print "Illegal "; }
方案2:哈希查表(适配非连续取值/复杂映射场景)
如果后续分支取值不是连续整数,可使用哈希做键值映射,无需存储子例程,直接映射输出值即可:
my %pl_map = ( 0 => 'A', 1 => 'B', 2 => 'C', 3 => 'D', 4 => 'E', ); if (exists $pl_map{$pl}) { print $pl_map{$pl}; } else { print "Illegal "; }
如果分支需要执行多步逻辑而非单纯打印,可以使用你之前写的子例程映射写法,注意补上循环变量的
my声明即可修复报错:my %table_pl = ( 0 => sub { print "A"; }, 1 => sub { print "B"; }, 2 => sub { print "C"; }, 3 => sub { print "D"; }, 4 => sub { print "E"; }, ); # 循环变量加my声明,修复语法报错 for my $pl (0..5) { if (exists $table_pl{$pl}) { $table_pl{$pl}->(); } else { print "Illegal "; } }
方案3:传统多分支判断(无任何结构依赖)
如果不想引入查表结构,直接使用原生if-elsif多分支判断即可,逻辑直白无兼容问题:
if ($pl == 0) { print "A"; } elsif ($pl == 1) { print "B"; } elsif ($pl == 2) { print "C"; } elsif ($pl == 3) { print "D"; } elsif ($pl == 4) { print "E"; } else { print "Illegal "; }
内容的提问来源于stack exchange,提问作者Igor
相关产品推荐
相关产品推荐

