Regex 正则表达式:从PL/SQL代码中分离过程/函数

Regex 正则表达式:从PL/SQL代码中分离过程/函数,regex,perl,Regex,Perl,我正在编写Perl正则表达式代码,以便将PL/SQL过程从包中分离出来 每个过程都以过程关键字开始,以结束结束,但结束用于开始、如果或循环。可能会有许多“如果开始”循环 下面是输入的种类,我想分开每个程序。我该怎么做 PROCEDURE LOG_ECS_MSG( MD_CURR CHAR, MSG_TIME DATE ) IS PRAGMA AUTONOMOUS_TRANSACTION; BEGIN BEGIN INSERT INTO INFO_SER

我正在编写Perl正则表达式代码,以便将PL/SQL过程从包中分离出来

每个过程都以过程关键字开始,以结束结束,但结束用于开始、如果或循环。可能会有许多“如果开始”循环

下面是输入的种类,我想分开每个程序。我该怎么做

PROCEDURE LOG_ECS_MSG( MD_CURR  CHAR,
                     MSG_TIME DATE ) IS
PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
BEGIN
INSERT INTO INFO_SERV_ECS_LOG
VALUES ( MD_CURR, MD, SVTY, ACT_DATE, ACCT, MSG_TXT, MSG_TIME);
COMMIT;
END;
END;




PROCEDURE LOG_ECS_MSG( MD_CURR  CHAR,
                     MSG_TIME DATE ) IS
PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
IF....
INSERT INTO INFO_SERV_ECS_LOG
VALUES ( MD_CURR, MD, SVTY, ACT_DATE, ACCT, MSG_TXT, MSG_TIME);
COMMIT;
END IF
END;

最简单的方法是根据
过程的出现逻辑上分隔文本:

undef $/;
my $line = <DATA>;
my @proc = split /(?=^PROCEDURE )/m, $line;
use Data::Dumper;
die Dumper \@proc;
undf$/;
我的$line=;
我的@proc=split/(?=^PROCEDURE)/m$line;
使用数据::转储程序;
模具倾卸器\@proc;

对于快速而肮脏的解决方案,查找令牌过程足以分离代码块。但是,如果您想让它成为一个成熟的解决方案,您应该真正尝试为PL/SQL找到(或编写)一个解析器,并改用它。否则,您无法处理字符串或注释中出现的令牌过程。

请尝试以下操作:

#!/usr/bin/perl
use strict;
use warnings;
use Data::Dumper;

undef $/;
my $line = <DATA>;
my @procedures = split /(?=PROCEDURE)/, $line;
print Dumper(\@procedures);

__DATA__
PROCEDURE LOG_ECS_MSG( MD_CURR  CHAR,
                     MSG_TIME DATE ) IS
PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
BEGIN
INSERT INTO INFO_SERV_ECS_LOG
VALUES ( MD_CURR, MD, SVTY, ACT_DATE, ACCT, MSG_TXT, MSG_TIME);
COMMIT;
END;
END;




PROCEDURE LOG_ECS_MSG( MD_CURR  CHAR,
                     MSG_TIME DATE ) IS
PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
IF....
INSERT INTO INFO_SERV_ECS_LOG
VALUES ( MD_CURR, MD, SVTY, ACT_DATE, ACCT, MSG_TXT, MSG_TIME);
COMMIT;
END IF
END;

好吧,问题是什么?你试过什么?我以前从没试过。。但是你晚了六个小时才回复我的回复。。说真的,只有当“完全”表示“相似但不同”时才是这样。M42将过程与文本一起保留,因为他使用了前瞻。这比你的解决方案要好得多。@brain d foy,非常小的一点,如果需要,很容易切换。去别的地方。你很清楚,这么小的事情应该是一个评论。而且,现在他的问题仍然存在,因为它捕获任何过程标记,即使它不是行中的第一个单词。@Evan Carroll:可能它与您的类似,但我给出了一个示例输出,您无法处理您的第一个响应,因为它不起作用。您的行为多好,您多大了?
$VAR1 = [
          'PROCEDURE LOG_ECS_MSG( MD_CURR  CHAR,
                     MSG_TIME DATE ) IS
PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
BEGIN
INSERT INTO INFO_SERV_ECS_LOG
VALUES ( MD_CURR, MD, SVTY, ACT_DATE, ACCT, MSG_TXT, MSG_TIME);
COMMIT;
END;
END;




',
          'PROCEDURE LOG_ECS_MSG( MD_CURR  CHAR,
                     MSG_TIME DATE ) IS
PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
IF....
INSERT INTO INFO_SERV_ECS_LOG
VALUES ( MD_CURR, MD, SVTY, ACT_DATE, ACCT, MSG_TXT, MSG_TIME);
COMMIT;
END IF
END;'
        ];