У меня есть код, который выдает следующую ошибку - «Не удается создать неизвестное регулярное выражение: $ RE {some} {pattern}», когда я запускаю его с помощью модуля Regexp :: Common.
Целью кода является чтение файла, поиск строки и выполнение 2 условий.Первое условие: если для вывода присутствует функция синхронизации, найдите строку «direction: output», найдите последовательные строки ниже и удалите строку, содержащую «max_transition:», а если функция синхронизации отсутствует, то ничего не делайте.Если присутствует функция синхронизации и строка поиска - «direction: input», то ничего не делать.Это должно быть сделано несколько раз в файле.Когда я использую строку if ($ RE {some} {pattern} -> соответствует ($ str)), код выдает вышеуказанную ошибку.Пожалуйста, помогите мне решить эту ошибку.
#!/usr/bin/perl
use Data::Dumper;
use Regexp::Common;
use strict;
use warnings;
my $inputfile = $ARGV[0];
my $str = "direction : output";
open (INFILE,"<","$inputfile") || die "Can not open Input LIB File";
open (my $OPFILE,">","tmpdir/input_lib.lib") || die "Can not open Input Text File";
sub do_something_with {
my $string=shift;
if( $RE{some}{pattern}->matches($str) ) {
if ($string =~ m{timing +($RE{balanced}{-parens=>'()'} +$RE{balanced}{-parens=>'{}'})}) { # has a timing group
$string =~ s{^.*max_transition.*\r?\n}{}m;
}
}
}
return $string;
}
local $/;
my $string=<INFILE>;
$string=~ s{pin +($RE{balanced}{-parens=>'()'} +$RE{balanced}{-parens=>'{}'})}{"pin ".do_something_with($1)}ge;
print $OPFILE "$string";
close INFILE;
close $OPFILE;
Мой ввод:
cell (lib) {
dont_use : true ;
dont_touch : true ;
pin ("A") {
direction : input ;
related_power_pin : VDD ;
max_transition : 1 ;
}
pin ("B") {
direction : output ;
related_power_pin : VDD ;
max_transition : 10;
}
pin ("C") {
direction : input ;
related_power_pin : VDD ;
max_transition : 1 ;
}
pin ("D") {
direction : output ;
max_transition : 10;
related_power_pin : VDD ;
}
pin ("E") {
direction : output ;
clock : true ;
max_transition : 20;
related_power_pin : VDD ;
related_ground_pin : VSS ;
timing () {
cell_fall (into_f1) {
index_1("1,2,3,4,5") ;
index_2("1,2,3,4,5") ;
values("13, 13, 14, 16, 18",\
"13, 14, 15, 16, 19",\
"14, 15, 16, 17, 20",\
"15, 15, 16, 18, 20",\
"15, 16, 17, 18, 21") ;
}
pin ("F") {
direction : input ;
clock : true ;
max_transition : 20;
related_power_pin : VDD ;
related_ground_pin : VSS ;
timing () {
cell_fall (into_f1) {
index_1("1,2,3,4,5") ;
index_2("1,2,3,4,5") ;
values("13, 13, 14, 16, 18",\
"13, 14, 15, 16, 19",\
"14, 15, 16, 17, 20",\
"15, 15, 16, 18, 20",\
"15, 16, 17, 18, 21") ;
}
}
}
Мой предполагаемый вывод:
cell (lib) {
dont_use : true ;
dont_touch : true ;
pin ("A") {
direction : input ;
related_power_pin : VDD ;
max_transition : 1 ;
}
pin ("B") {
direction : output ;
related_power_pin : VDD ;
max_transition : 10;
}
pin ("C") {
direction : input ;
related_power_pin : VDD ;
max_transition : 1 ;
}
pin ("D") {
direction : output ;
max_transition : 10;
related_power_pin : VDD ;
}
pin ("E") {
direction : output ;
clock : true ;
related_power_pin : VDD ;
related_ground_pin : VSS ;
timing () {
cell_fall (into_f1) {
index_1("1,2,3,4,5") ;
index_2("1,2,3,4,5") ;
values("13, 13, 14, 16, 18",\
"13, 14, 15, 16, 19",\
"14, 15, 16, 17, 20",\
"15, 15, 16, 18, 20",\
"15, 16, 17, 18, 21") ;
}
pin ("F") {
direction : input ;
clock : true ;
max_transition : 20;
related_power_pin : VDD ;
related_ground_pin : VSS ;
timing () {
cell_fall (into_f1) {
index_1("1,2,3,4,5") ;
index_2("1,2,3,4,5") ;
values("13, 13, 14, 16, 18",\
"13, 14, 15, 16, 19",\
"14, 15, 16, 17, 20",\
"15, 15, 16, 18, 20",\
"15, 16, 17, 18, 21") ;
}
}
}