Вам, вероятно, следует использовать оператор диапазона с шаблонами, которые соответствуют началу и концу раздела.Глядя на ваши входные данные, я бы предложил:
- 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