我怎样才能重构这一系列重复的"if"块?

est*_*est 1 perl

我闻到了一些不好的东西?

    if ($col == 24) {
        $buffer{'Y'} = trim($val);
        return;
    }

    if ($col == 25) {
        $buffer{'Z'} = trim($val);
        return;
    }

    if ($col == 26) {
        $buffer{'AA'} = trim($val);
        return;
    }

    if ($col == 27) {
        $buffer{'AB'} = trim($val);
        return;
    }

Tan*_*lus 14

这些名字看起来也很可疑.如果您循环遍历列,请尝试使用magic ++运算符.

my $colname = 'A';
for (0..$#cols)
{
   # do stuff with $colname
   $buffer{$colname} = trim($val);
   ++$colname;
}
Run Code Online (Sandbox Code Playgroud)

如果没有,这里似乎有一个模式可以用来将数字从十进制(数字)转换为字母.你可以像将数字转换为十进制一样,除了你使用字符AZ,基数26,而不是0-9,基数10.类似于:

sub colname
{
  my $num = shift;
  my $name = '';
  while ($num)
  {
    $name .= chr(ord('A') + $num % 26);
    $num /= 26;
  }
  reverse $name;
}
Run Code Online (Sandbox Code Playgroud)

(未经测试)此算法与语言无关.它没有特别利用perlishness,但作为一般案例非常有效.

更新:我告诉过你这是未经测试的.j_random_hacker指出了思考,我已经纠正过了.谢谢!

  • 最后一行不应该是"反向$ name;"吗?否则好. (2认同)

Geo*_*ips 12

关联数组在这些情况下运行良好.首先初始化:

my %colToBuffer = ( 24 => 'Y', 25 => 'Z', 26 => 'AA', 27 => 'AB');
Run Code Online (Sandbox Code Playgroud)

然后代码可以是:

if (exists $colToBuffer{$col})
{
    $buffer{$colToBuffer{$col}} = trim($val);
}
Run Code Online (Sandbox Code Playgroud)

品尝季节.