小编kat*_*sza的帖子

如何在Perl中进行条件贪婪匹配?

我希望Perl解析代码文本并识别某些东西,例如代码:

use strict;
use warnings;

$/ = undef;

while (<DATA>) {
  s/(\w+)(\s*<=.*?;)/$1_yes$2/gs;
  print;
}

__DATA__
always @(posedge clk or negedge rst_n)
if(!rst_n)begin
        d1 <= 0; //perl_comment_4
        //perl_comment_5
        d2 <= 1  //perl_comment_6
                 + 2;
        end
else if( d3 <= d4 && ( d5 <= 3 ) ) begin
        d6 <= d7 +
                 (d8 <= d9 ? 1 : 0);
        //perl_comment_7
        d10 <= d11 <=
                      d12
                        + d13
                            <= d14 ? 1 : 0;
        end
Run Code Online (Sandbox Code Playgroud)

匹配目标是满足以下所有条件的:

(1)从组合开始word\s*<=.这里\s*可能有0个或更多空格,换行符,制表符.

(2)上述"组合"应该是任何一对 …

regex perl conditional match greedy

5
推荐指数
1
解决办法
237
查看次数

如何做 Perl 状态机(FSM)来解析比特流(字节序列)?

我目前正在使用 Perl 来解析来自 RS232 串行端口的传入命令序列。我尝试使用状态机,它的预期行为是:(1)从串口接收一系列字节;(2) 状态机使用字节作为输入,并跳转到适当的状态。

我想出了一个简化的演示Perl代码(贴在下面),但是遇到了一个问题: 当代码进入“while(1){}”时,就卡在这里,出不来。 因此,$din 字节序列分配被“while(1){}”阻止,并且对状态机不可见。因此,FSM 卡在“INIT”状态,根本不跳转。

我认为这应该是 Perl 编码中一个非常简单或入门级的练习,但是通过 Google 搜索并没有太大帮助。谁能帮我这个?先谢谢了~

...
my %next_state = (
        "INIT" => sub{
                $din eq "AA" and return "HEADER0" ;
                return "INIT"                     ;
                },
        "HEADER0" => sub{
                $din eq "99" and return "HEADER1" ;
                return "INIT"                     ;
                },
        ...
        );

# Set state machine's initial state.
my $cur_state = "INIT"   ;

# Integer for debugging purpose.
my $itgi = 0;

# Run the state machine. …
Run Code Online (Sandbox Code Playgroud)

perl parsing byte command fsm

3
推荐指数
1
解决办法
76
查看次数

标签 统计

perl ×2

byte ×1

command ×1

conditional ×1

fsm ×1

greedy ×1

match ×1

parsing ×1

regex ×1