0

ファイルで見つかったすべての作成テーブル 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;

現在、ファイルには複数のテーブル作成 ddl があり、カタログ、スキーマ、ビューなどを作成する他の ddl があります。

私は次のことを試しました:

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))
        }
}       

changeddl次に、ファイル(ddlが含まれていますが、機能しません)でcallを呼び出します。助けてください。

4

2 に答える 2

2

アプローチを少し変更しました。1 つのステップでテスト/置換を実行できるため、一致して置換する必要はありません。

マッチングCreate\s*Tableとその後のすべては;char ではなく、肯定的な後ろ向きを使用します\K

if ($data =~ s/Create\s*Table[^;]+\K/blsize 2048/gi) {
   write_file(($_, $data))
}
于 2014-05-13T06:28:50.327 に答える