Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex perl中的正则表达式替换_Regex_Perl_Fileslurp - Fatal编程技术网

Regex perl中的正则表达式替换

Regex perl中的正则表达式替换,regex,perl,fileslurp,Regex,Perl,Fileslurp,在文件中找到的所有创建表DDL中,有一个字符串需要插入分号(;)之前 CREATE TABLE Persons ( PersonID int, LastName varchar(255), FirstName varchar(255), Address varchar(255), City varchar(255) ); 产出将是: CREATE TABLE Persons ( PersonID int, LastName varchar(255), FirstName varchar(255

在文件中找到的所有创建表DDL中,有一个字符串需要插入分号(;)之前

CREATE TABLE Persons
(
PersonID int,
LastName varchar(255),
FirstName varchar(255),
Address varchar(255),
City varchar(255)
);
产出将是:

CREATE TABLE Persons
(
PersonID int,
LastName varchar(255),
FirstName varchar(255),
Address varchar(255),
City varchar(255)
)
BLKSIZE 2048;
现在文件中有多个create table DDL,还有其他DDL,如创建目录、模式、视图等。我只希望插入的字符串仅用于create table stmt

我尝试了以下方法:

sub read_file {
        my ($filename) = @_;
        print "$filename \n";
        open my $in, '<', $filename or carp "Could not open '$filename' for reading $!";
        local $/ = undef;
        my $all = <$in>;
        close $in;
        return $all;
}   

sub write_file {
        my ($filename, $content) = @_;
        open my $out,'>', $filename or carp "Could not open '$filename' for writing $!";
        print $out $content;
        close $out;
        return;
}   

sub changeddl{
        my $data = read_file($_);
        print "$data \n";
        if($data=~m/\s*Create\s*Table.*/im){
                $data=~s/(\s*Create\s*Table).*(;$)/$1 blsize 2048 $2/gmi;
                write_file(($_, $data))
        }
}       
子读取文件{
我的($filename)=@;
打印“$filename\n”;
打开我的$in、、$filename或carp“无法打开$filename”以写入$!”;
打印$out$内容;
收尾美元;
返回;
}   
子变更{
my$data=读取文件($);
打印“$data\n”;
if($data=~m/\s*创建\s*表。*/im){
$data=~s/(\s*创建\s*表格)。*(;$)/$1BLSIZE2048$2/gmi;
写入文件(($数据))
}
}       

然后我用一个文件调用call
changeddl
(其中包含ddl,但不起作用。)请帮助。

您应该使用
s
(单行)标志,而不是
gm

您还应该将dotall令牌放在第一个捕获组中

像这样:

s/(\s*Create\s*Table.*?);/$1BLKSIZE 2048;/si

我改变了一点方法,不需要匹配和替换,因为您可以一步完成测试/替换

匹配
Create\s*Table
之后的所有内容都不是
字符,使用正向后视
\K

if ($data =~ s/Create\s*Table[^;]+\K/blsize 2048/gi) {
   write_file(($_, $data))
}

非常感谢。有效地工作。非常感谢你。