【问题标题】:Perl program for extracting the functions alone in a Ruby file用于在 Ruby 文件中单独提取函数的 Perl 程序
【发布时间】:2011-01-08 17:34:15
【问题描述】:

我有以下 Ruby 程序。

    puts "hai"
     def mult(a,b)
        a * b
     end
     puts "hello"
     def getCostAndMpg
       cost = 30000  # some fancy db calls go here
       mpg = 30
       return cost,mpg
     end
   AltimaCost, AltimaMpg = getCostAndMpg
   puts "AltimaCost = #{AltimaCost}, AltimaMpg = {AltimaMpg}"

我编写了一个 perl 脚本,它将单独提取 Ruby 文件中的函数,如下所示

while (<DATA>){ 
   print if ( /def/ .. /end/ );
}

这里的&lt;DATA&gt; 正在从 ruby​​ 文件中读取。

所以 perl 程序产生以下输出。

def mult(a,b)
    a * b
end
def getCostAndMpg
    cost = 30000  # some fancy db calls go here
    mpg = 30
    return cost,mpg
end

但是,如果函数有语句块,例如它有一个 if 条件测试块,则意味着它不工作。它只占用“if”块的“end”。而且它没有占用功能的“结束”。请为我提供解决方案。

例子:

def function
   if x > 2
      puts "x is greater than 2"
   elsif x <= 2 and x!=0
      puts "x is 1"
  else
      puts "I can't guess the number"
  end  #----- My code parsing only up to this
end

提前致谢!

【问题讨论】:

    标签: perl


    【解决方案1】:

    如果您的代码正确缩进,您只需要以 def 或 end 开头的行,因此将您的程序更改为:

    而(){ 打印 if ( /^def/ .. /^end/ ); }

    或者在没有程序文件的情况下运行它 - 从命令行运行程序,使用 -n 让 perl 将其视为从 STDIN 读取的 while 循环:

    perl -n -e "打印 if ( /^def/ .. /^end/ );"

    【讨论】:

      【解决方案2】:

      我不熟悉 ruby​​ 语法,但如果你能确保整个代码有良好的缩进,你可以根据缩进进行检查。类似于:

      my $add = 0;
      my $spaces;
      while(my $str = <DATA>) {
          if (! $add && $str =~ /^(\s*)def function/) {
              $add = 1;
              $spaces = $1;
          }
          if ($add) {
              print $_;
              $add = 0 if ($str =~ /^$spaces\S/);
          }
      }
      

      【讨论】:

        【解决方案3】:

        另一个选项可能是计算程序的级别,如下所示:

        my $level = 0;
        while(<DATA>) {
            if(/\b def \b/x .. /\b end \b/x && $level == 0) {
                $level++ if /\b if  \b/x;   # put all statements that closes by end here
                $level-- if /\b end \b/x;
                print;
            }
        }
        

        我对 ruby​​ 语法不是很熟悉,因此您需要将所有以 end 结尾的语句放入带有 $level++ 的正则表达式中。

        请注意,我在这些关键字周围添加了 \b,以确保您匹配整个单词,而不是像 undef 这样的东西作为函数的开头。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-09-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-08-15
          • 2018-04-12
          • 2018-12-21
          相关资源
          最近更新 更多