Perl 风格:避免字节处理

  • C 程序员常常试图逐字节处理字符串。不要这样做!Perl 可以轻松地大块处理数据。
  • 不要使用 getc。一次性抓取整行并操作。
  • 即使在 C 中通常逐字符执行的操作,如词法分析,也应采用不同的方法。例如

        @chars = split //, $input;
        while (@chars) {
          $c = shift @chars;
          # State machine;
        }
    

    太底层了。尝试更类似于

        sub parse_expr {
        local $_ = shift;
        my @tokens = ();
        my $paren = 0;
        my $want_term = 1;
    
        while (length) {
            s/^\s*//;
    
            if (s/^\(//) {
            return unless $want_term;
            push @tokens, '(';
            $paren++;
            $want_term = 1;
            next;
            } 
    
            if (s/^\)//) {
            return if $want_term;
            push @tokens, ')';
            if ($paren < 1) {
                return;
            } 
            --$paren;
            $want_term = 0;
            next;
            } 
    
            if (s/^and\b//i || s/^&&?//) {
            return if $want_term;
            push @tokens, '&';
            $want_term = 1;
            next;
            } 
    
            if (s/^or\b//i || s/^\|\|?//) {
            return if $want_term;
            push @tokens, '|';
            $want_term = 1;
            next;
            } 
    
            if (s/^not\b//i || s/^~// || s/^!//) {
            return unless $want_term;
            push @tokens, '~';
            $want_term = 1;
            next;
            } 
    
            if (s/^(\w+)//) {
            push @tokens, '&' unless $want_term;
            push @tokens, $1 . '()';
            $want_term = 0;
            next;
            } 
    
            return;
    
        }
        return "@tokens";
        }
    

转到 避免符号引用
返回到 使用 foreach() 循环
返回到 索引

版权 © 1998, Tom Christiansen 所有权利保留。

标签

反馈

这篇文章有什么问题吗?请在 GitHub 上打开一个问题或拉取请求来帮助我们。