搜索和替换模式的Perl代码

j7dteeu8  于 2022-12-04  发布在  Perl
关注(0)|答案(3)|浏览(95)
output        [15:0] pin;                
output         [1:0] en;                
input          [6:0] dddr;            
input          [6:0] dbg;

将此替换为(我正在计算总线数)

16 : pin : output;                         
2 : en : output;                
7 : dddr : input;            
7 : dbg :input;

我尝试了这个代码后,打开文件,并将其存储在var.,但我不能过滤它像上面

if ($var =~ /(\w+)\[(\d+)\:/) {  
    print "word=$1 number=$2\n";
}

//我正在尝试添加:在列的中间还

6mzjoqzu

6mzjoqzu1#

You are missing the whitespace after the word characters in your pattern.

(\w+ )       \[(\d+):
      VVVVVVVV
output        [15:0] pin;

This is easily fixed. Add it into the pattern in between, like so:

use strict;
use warnings;
use feature 'say';

while (my $line = <DATA>) {
    if ($line =~ /(\w+)\s+\[(\d+)\:/) {
        say "word=$1 number=$2";
    }
}

__DATA__
output        [15:0] pin;
output         [1:0] en;
input          [6:0] dddr;
input          [6:0] dbg;

This produces:

word=output number=15
word=output number=1
word=input number=6
word=input number=6

To get to your desired output, you'll have to refine the pattern and probably do some incrementing too.

u4vypkhs

u4vypkhs2#

您没有考虑(\w+)和正则表达式的(\d+)部分之间的空格。

while (<DATA>)
{
    if ( /(\w+)\s+\[(\d+)\:/) {  
        print "word=$1 number=$2\n";
    }
}

__DATA__
output        [15:0] pin;                
output         [1:0] en;                
input          [6:0] dddr;            
input          [6:0] dbg;

输出这个

word=output number=15
word=output number=1
word=input number=6
word=input number=6

为了接近您的最终需求,可以扩展正则表达式以匹配您需要的其他部分,如下所示

while (<DATA>)
{
    if ( /(\w+)\s+\[(\d+)\:\d+\]\s+(.*);/) {  
        print "$2 : $3 : $1\n";
    }
}

__DATA__
output        [15:0] pin;                
output         [1:0] en;                
input          [6:0] dddr;            
input          [6:0] dbg;

输出此

15 : pin : output
1 : en : output
6 : dddr : input
6 : dbg : input

不确定如何计算第一列的值。它似乎是数字字段+ 1。是否正确?

nle07wnf

nle07wnf3#

解析所示数据的一种方法

use warnings;
use strict;
use feature 'say';

while (<>) {             
    if ( /(\S+) \s+ \[ ([0-9]+):[0-9]+ \] \s+ (\S+)/x ) {
        say $2+1, ' : ', $3, ' : ', $1, ';';  
    }
}

以下是一些评论。
在大多数正则表达式模式中,很大程度上取决于输入数据格式的细节,以及期望和允许的数据的灵活性。

  • \S+匹配一个非空白字符串;假设开头有一个单词,可以包含任何非空格字符。如果可能有多个单词,则使用.+?代替,它匹配所有到以下模式的第一个示例(这里是;,所以更好的是,可以使用[^;]+
  • 我使用了相当宽松的\S,因为没有告诉任何关于数据的内容。
  • []内不允许有空格,只能是数字之间有:。如果数据可以有空格,则使用\[\s*\s*\]
  • 最后,一个单词与\S+匹配,其中包含任何非空格字符。如果预期会有多个单词,则再次使用.+?。该部分甚至可能包含分号,在这种情况下,您需要.+,它包含 * 所有 * 内容,直到最后一个;
  • 在所有这些情况下,量词+要求前面的模式至少出现一次。如果可以接受数据中的那个位置没有任何内容(例如,最后一个单词缺失),那么就使用量词*代替,比如.*

因此,尽可能多地了解数据是什么样的,并仔细阐明要求,明确限制/允许什么是重要的。

相关问题