perl脚本,用于从带有开始和结束关键字的文件中搜索多行

perl脚本,用于从带有开始和结束关键字的文件中搜索多行,perl,Perl,我试图在.sql文件中搜索sql语句,该语句以CREATETABLE开头,后跟字段值,然后是关键字[TB_DATA and TB_INDX],最后是;它有多行 -- CREATE TABLE HDTB_COD; CREATE TABLE HDTB_CODE( IDPK VARCHAR(256) NOT NULL) IN TB_DATA INDEX IN TB_INDX; CREATE TABLE HDTB_RES (ARTID VARCHAR(256) NOT NULL) IN TB_DA

我试图在.sql文件中搜索sql语句,该语句以CREATETABLE开头,后跟字段值,然后是关键字[TB_DATA and TB_INDX],最后是;它有多行

-- CREATE TABLE HDTB_COD;
CREATE TABLE HDTB_CODE( IDPK VARCHAR(256) NOT NULL)

IN TB_DATA INDEX 
IN TB_INDX;

CREATE TABLE HDTB_RES
(ARTID VARCHAR(256) NOT NULL)
IN TB_DATA INDEX 
IN TB_INDX;
-- DROP TABLE HDTB_COD;
CREATE TABLE HDTB_DE ( IDPK VARCHAR(256) 
NOT NULL); 
.sql文件语句位于多行中

-- CREATE TABLE HDTB_COD;
CREATE TABLE HDTB_CODE( IDPK VARCHAR(256) NOT NULL)

IN TB_DATA INDEX 
IN TB_INDX;

CREATE TABLE HDTB_RES
(ARTID VARCHAR(256) NOT NULL)
IN TB_DATA INDEX 
IN TB_INDX;
-- DROP TABLE HDTB_COD;
CREATE TABLE HDTB_DE ( IDPK VARCHAR(256) 
NOT NULL); 
-------------输出----------------------

CREATE TABLE HDTB_CODE( IDPK VARCHAR(256) NOT NULL)

IN TB_DATA INDEX IN TB_INDX;

CREATE TABLE HDTB_RES(ARTID VARCHAR(256) NOT NULL)

IN TB_DATA INDEX IN TB_INDX;
工作原理

chomp; # remove newlines
next if (/^--/);  #skip lines that are SQL comments
@p = () if /CREATE TABLE/; #start of a table definition, clear array @p
push @p, $_; # put current line into array @p
#condition found, print @p    
if (/IN TB_DATA INDEX IN TB_INDX;/) { print "@p\n"; }

下面是一个如何创建快速而肮脏的解析管道的示例。一旦理解了基本模式,就很容易添加更多过滤步骤(使用
grep
)或转换步骤(使用
map

#拖拽整个文件。
my$sql=do{local$/=unde;};
# 1. 抓取CREATETABLE语句。
# 2. 仅保留利益声明。
# 3. 打印前根据需要修改语句。
打印
地图{“$\n”}\3b。添加尾随的换行符。
映射{s/\s+//g;$#3a。规范化空白。
grep{/IN TB_INDX/}#2b。过滤器。
grep{/IN TB_数据索引/}#2a。过滤器。
$sql=~/^(创建表格+?;)\s*$/gsm;#1.抓住。

如何签入perl脚本我希望它只存储在CREATE TABLE到;分号如if(/CREATE TABLE/)直到(/;/)进入一个单独的文件对不起,我不明白你在问什么Vivek?.sql文件将有多行数据打开我的$fh,“
s/(?!)\s*-.$/;
推送之前添加它
# Slurp entire file.
my $sql = do { local $/ = undef; <> };

# 1. Grab the CREATE TABLE statements.
# 2. Retain only the statements of interest.
# 3. Modify the statements as needed before printing.
print
    map  { "$_\n" }                         # 3b. Add trailing newlines.
    map  { s/\s+/ /g; $_ }                  # 3a. Normalize whitespace.
    grep { /IN TB_INDX/ }                   # 2b. Filter.
    grep { /IN TB_DATA INDEX/ }             # 2a. Filter.
    $sql =~ /^(CREATE TABLE .+?;)\s*$/gsm;  # 1.  Grab.