Perl скрипт для grep для всегда блокирования и печати указанных строк - PullRequest
0 голосов
/ 14 февраля 2019

Мне нужно извлекать файлы, читать построчно и искать блок Always_ff.Если присутствует Always_ff, то мне нужно напечатать определенные строки из найденного блока Always_ff

use strict;
use warnings;

for my $file ('*.sv')
{
   open my $fh, "<", $file or die $!;
   while (<$fh>) {
     print scalar <$fh> if /begin/;
   }
}

Файл имеет:

always_ff @(negedge clk )
    begin
       if (!clk)
       begin
          p1 <= 1'b0;
       end
       else
       begin
         p1 <= disable_ff;
       end
    end

always_ff @(negedge clk)
    begin
       if (!clk)
       begin
          p2<= enable;
       end
       else
       begin
          p2 <= disable_ff;
       end
    end

Ожидаемый результат:

p1 <= disable_ff
p2<= enable
p2 <= disable_ff;

Фактический результат:

if (!clk)
  p1 <= disable_ff;

1 Ответ

0 голосов
/ 14 февраля 2019

Вам, вероятно, следует использовать оператор диапазона с шаблонами, которые соответствуют началу и концу раздела.Глядя на ваши входные данные, я бы предложил:

  • start: match "Always_ff" плюс пробел, т. Е. /always_ff\s+/
  • end: пустая строка, т. Е. /^\s*$/
  • в блоке: вывести строки с присваиванием, т.е. /<=/

Цитата из perlop :

В скалярном контексте .. возвращает логическое значение.Оператор является бистабильным, как триггер ... Он ложен, если его левый операнд ложен.Если левый операнд равен true, оператор диапазона остается истинным, пока правый операнд не станет true, ПОСЛЕ того, как оператор диапазона снова становится ложным.

Примерно так:

#!/usr/bin/perl
use warnings;
use strict;

while (<DATA>) {
    if (/always_ff\s+/../^\s*$/) {
        print if /<=/;
    }
}

exit 0;

__DATA__
always_ff @(negedge clk )
    begin
       if (!clk)
       begin
          p1 <= 1'b0;
       end
       else
       begin
         p1 <= disable_ff;
       end
    end

always_ff @(negedge clk)
    begin
       if (!clk)
       begin
          p2<= enable;
       end
       else
       begin
          p2 <= disable_ff;
       end
    end

Тествывод:

$ perl dummy.pl
          p1 <= 1'b0;
         p1 <= disable_ff;
          p2<= enable;
          p2 <= disable_ff;

Для вашего случая чтения *.sv файлов замените <DATA> из моего тестового кода на <STDIN> и используйте следующую командную строку оболочки:

$ cat *.sv | perl script.pl
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...