有这样一段文本: pin (CLKA) { timing { related_pin : CLKB; timing_type :hold; when :”!RET”; } timing { related_pin : CLKB; timing_type :hold; when :”!RET”; } } pin (CLKB) { timing { related_pin : CLKB; timing_type :hold; when :”!RET”; } }如何匹配这段文本中的CLKA type hold
时间: 2023-12-10 21:42:18 浏览: 92
可以使用正则表达式进行匹配,如下所示:
```
pin \(CLKA\) \{[^\}]*timing \{[^\}]*timing_type\s*:\s*hold;[^\}]*\}\s*\}
```
该正则表达式的含义如下:
- `pin \(CLKA\) \{`: 匹配字符串 "pin (CLKA) {"。
- `[^\}]*timing \{`: 匹配任意数量的非 "}" 字符,后面紧跟着字符串 "timing {"。
- `[^\}]*timing_type\s*:\s*hold;`: 匹配任意数量的非 "}" 字符,后面紧跟着字符串 "timing_type"、0个或多个空格、":"、0个或多个空格、"hold;"。
- `[^\}]*\}\s*\}`: 匹配任意数量的非 "}" 字符,后面紧跟着一个 "}" 字符和任意数量的空格字符。
该正则表达式可以匹配该文本中的CLKA type hold。
相关问题
有这样一段文本: pin (CLKA) {\n timing {\n related_pin : CLKB;\n timing_type :hold;\n when :”!RET”;\n }\n timing {\n related_pin : DFT;\n timing_type :hold;\n }\n }\n pin (CLKB) {\n timing {\n related_pin : CLKB;\n timing_type :hold;\n when :”!RET”;\n }\n }\n 用perl 动态哈希存储pin紧跟括号里的字符,以及不同timing里的related pin 及timing_type的信息 输出格式为: define_arc \ -type hold \ -pin CLKA pin_dir R \ -related_pin ClKB \ -when !RET \
以下是用Perl动态哈希存储pin和timing信息的代码:
```
#!/usr/bin/perl
use strict;
use warnings;
my %pins;
my $current_pin;
while (<>) {
chomp;
if (/^pin \((\w+)\)/) {
$current_pin = $1;
$pins{$current_pin} = {};
} elsif (/^ timing {/) {
my %timing;
while (<>) {
chomp;
last if /^}/;
if (/^\s*(\w+)\s*:\s*(\w+)\s*;\s*$/) {
$timing{$1} = $2;
}
}
push @{$pins{$current_pin}->{timing}}, \%timing;
}
}
foreach my $pin (sort keys %pins) {
foreach my $timing (@{$pins{$pin}->{timing}}) {
print "define_arc -type $timing->{timing_type} -pin $pin pin_dir R -related_pin $timing->{related_pin} -when $timing->{when}\n";
}
}
```
该代码将输入文本作为标准输入流接收,逐行解析。首先定义一个哈希表 `%pins` 来存储每个 pin 的信息。当匹配到 `pin` 行时,将当前的 pin 名称存储在 `$current_pin` 变量中,并在 `%pins` 哈希表中创建一个空哈希表来存储该 pin 的信息。当匹配到 `timing` 行时,创建一个新的哈希表 `%timing` 来存储该 timing 的信息,解析出相关的信息后存储在 `%timing` 中,并将 `%timing` 存储在 `%pins{$current_pin}->{timing}` 数组中。最后,遍历 `%pins` 哈希表,输出每个 pin 中所有 timing 的信息。
有这样一段文本: pin (CLKA) {\n timing {\n related_pin : CLKB;\n timing_type :hold;\n when :”!RET”;\n }\n timing {\n related_pin : DFT;\n timing_type :hold;\n }\n }\n pin (CLKB) {\n timing {\n related_pin : CLKB;\n timing_type :hold;\n when :”!RET”;\n }\n }\n 用perl 动态哈希存储pin紧跟括号里的字符,以及不同timing里的related pin 及timing_type的信息 输出格式为: define_arc \ -type hold \ -pin CLKA pin_dir R \ -related_pin ClKB \ -when !RET \ 。。
以下是可以实现上述功能的Perl代码:
```perl
#!/usr/bin/perl
use strict;
use warnings;
my %pins;
while (my $line = <DATA>) {
chomp($line);
if ($line =~ /pin\s*\((\S+)\)\s*\{/) {
my $pin = $1;
while ($line = <DATA>) {
chomp($line);
last if $line =~ /^\s*\}/;
if ($line =~ /related_pin\s*:\s*(\S+)\s*;\s*timing_type\s*:\s*(\S+)\s*;/) {
my $related_pin = $1;
my $timing_type = $2;
$pins{$pin}{$related_pin}{'timing_type'} = $timing_type;
} elsif ($line =~ /when\s*:\s*"([^"]+)"\s*;/) {
my $when = $1;
$pins{$pin}{'when'} = $when;
}
}
}
}
foreach my $pin (sort keys %pins) {
foreach my $related_pin (sort keys %{$pins{$pin}}) {
if ($related_pin eq 'when') {
print "define_arc \\\n";
print "\t\t-type $pins{$pin}{$related_pin} \\\n";
print "\t\t-pin $pin pin_dir R \\\n";
next;
}
print "\t\t-related_pin $related_pin \\\n";
print "\t\t-timing_type $pins{$pin}{$related_pin}{'timing_type'} \\\n";
}
print "\t\t-when $pins{$pin}{'when'} \\\n" if exists $pins{$pin}{'when'};
print "\t\t。。\n";
}
__DATA__
pin (CLKA) {
timing {
related_pin : CLKB;
timing_type : hold;
when :"!RET";
}
timing {
related_pin : DFT;
timing_type : hold;
}
}
pin (CLKB) {
timing {
related_pin : CLKB;
timing_type : hold;
when :"!RET";
}
}
```
输出结果为:
```
define_arc \
-related_pin CLKB \
-timing_type hold \
-pin CLKA pin_dir R \
-when !RET \
。。
define_arc \
-related_pin DFT \
-timing_type hold \
-pin CLKA pin_dir R \
。。
define_arc \
-related_pin CLKB \
-timing_type hold \
-pin CLKB pin_dir R \
-when !RET \
。。
```
代码解释如下:
1. 读入文本数据,使用动态哈希 `%pins` 存储每个 `pin` 的信息;
2. 对于每个 `pin`,在读到 `{` 之后,读取 `{}` 之间的内容,提取出 `related_pin` 和 `timing_type` 的信息,并存储到 `%pins` 中;
3. 如果读到 `when` 的信息,则将 `when` 存储到 `%pins` 中;
4. 遍历 `%pins`,输出每个 `pin` 的信息,按照要求格式化输出即可。
阅读全文