找到编码错误

时间:2016-07-09 08:30:07

标签: perl

sub main(int argc, char *argv[]) {

    my $j = '@b(defgh|jk3m#9pqr$+uvwxy2';

    for ( int $i = 0; $i < 32; ++$i ) {
        print (grep {/\S/} split('\W|', $j))[$i % (split('', $j))[11] + $i % (split('',$j))[25] * $i % 19];
    }

    print "\n";

    return 0;
}

main() unless caller;

我的错误在哪里?我无法找到它。但我知道它可能在for循环中

1 个答案:

答案 0 :(得分:6)

您正在尝试使用C构造编写perl。

  1. 使用strictwarnings来帮助您解决常见错误。
  2. 删除C构造int argc, char *argv[]
  3. 删除C构造int $i=0;$i<32;++$i,你可以在perl中编写C风格的循环,但它不是非常有用。
  4. 将长复杂表达式分解为多个部分,以便您可以轻松地调试部件。
  5. main unless caller是一个奇怪的结构。如果您打算将其用作库,请不要调用您的函数main,并阅读perldoc perlmod
  6. 单字母变量通常很糟糕,应该更好地重命名。
  7. 在代码中使用幻数很容易出错,无法知道它们是否正确。
  8. 可以进一步改进,包括将循环语句移到循环之外。
  9. 重写代码,我得到以下内容:

    #!/usr/bin/env perl
    
    use warnings;
    use strict;
    
    main();
    
    sub main {
        my $j = '@b(defgh|jk3m#9pqr$+uvwxy2';
        for my $i ( 0 .. 31 ) {
            my @characters = grep { /\S/ } split /\W|/, $j;
    
            my ($first_mod)  = (split//,$j)[11];
            my $first_index  = $i % $first_mod;
    
            my ($second_mod) = (split//,$j)[25];
            my $second_index = $i % $second_mod * $i % 19;
    
            print $characters[ $first_index + $second_index ];
        }
        print "\n";
        return 0;
    }
    

    <强>输出

    beefdkb3emdrbuevd2bdeedjbke3dqbr
    

    进一步阅读

    perldoc perlintro

    perldoc perltrap C/C++ traps