Perl-программа для извлечения только функций из файла Ruby - PullRequest
0 голосов
/ 08 января 2011

У меня установлена ​​следующая программа на 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/ );
}

Здесь <DATA> читает из файла 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

Но, если функция имеет блок операторов, скажем, например, она имеетесли блок проверки состояния означает, что он не работает.Это занимает только до «конца» блока «если».И это не доходит до «конца» функции.Пожалуйста, предоставьте мне решения.

Пример:

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

Заранее спасибо!

Ответы [ 3 ]

1 голос
/ 08 января 2011

Если ваш код имеет правильные отступы, вам просто нужны строки, начинающиеся с def или end, поэтому измените вашу программу на:

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

Или вообще запустить его без файла программы - запустите программу из командной строки, используя -n, чтобы perl рассматривал ее как чтение цикла while из STDIN:

perl -n -e "print if ( /^def/ .. /^end/ );" < ruby-file.rb
1 голос
/ 08 января 2011

Я не знаком с синтаксисом 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/);
    }
}
0 голосов
/ 08 января 2011

Другим вариантом может быть подсчет уровня программы, примерно так:

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, поэтому вам нужно поместить все операторы, которые закрыты в конец, в регулярное выражение с $level++.

Обратите внимание, что я добавил \b вокруг этих ключевых слов, чтобы убедиться, что вы соответствуете целому слову, а не таким вещам, как undef в качестве начала функции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...