Perl简单的方法来做多项决策,比如分数(如果elif除外)



尝试寻求Perl专家对这种简单分数评分的反馈。我想到的是使用条件操作部分来模拟多路分支,但不知道是否有更简单/直接的语法可以表达,以增强可读性(以及未来的可维护性(。

来自Python/C,学习了这种新语言,所以我尝试探索新的语法。如果这听起来太天真的话。


my $grade = 
($score < 60)  ? "F" :
($score < 68)  ? "C" :
($score < 75)  ? "B" :
($score < 90)  ? "B+" :
($score < 95)  ? "A" :
($score <= 100) ? "A+" :
"No Grade";            # catch-all default

您需要一个由101个条目组成的hash数组,或者一个包含21个特殊情况的数组。以这种方式使用散列数组的优化毫无理由地为时过早。


在类似的情况下,通常会使用哈希或数组作为调度表,但在这里它不起作用,因为您必须包括所有可能的值。

嗯,也许不是所有可能的价值。例如,我们可以截断数字以删除小数点。如果所有的值都可以被5整除,我们除以5得到一个可管理的21个值。然后可以使用调度表。(尽管数组比散列更有效。(

68意味着我们不能那样做。65岁、66岁和67岁,或者68岁和69岁都需要特殊的外壳。100也是一个特殊值,因为您显然希望容忍无效输入。除非性能至关重要,否则这意味着一个糟糕的设计。


假设优化是有保证的。

您可以设置以下表格:

my @grades_lkup;
$grades_lkup[ $_ ] = "F"  for  0 ..  59;
$grades_lkup[ $_ ] = "C"  for 60 ..  67;
$grades_lkup[ $_ ] = "B"  for 68 ..  74;
$grades_lkup[ $_ ] = "B+" for 75 ..  89;
$grades_lkup[ $_ ] = "A"  for 90 ..  94;
$grades_lkup[ $_ ] = "A+" for 95 .. 100;

那么你只需要

my $grade = $grades_lkup[ $score ] // "No Grade";

相关内容