2016-08-10 3 views
0
#!/approot/opt/bin/perl 
use strict; 

my $file = $ARGV[0]; 
open FILE, $file or die; 
my $line; 

while (<FILE>) { 

if (m/create unique clustered index \S+ on \S+ \(([^\)]+)\)/) { 
    $line = $1; 
    } 
s/chargeable_items/$line/; 

print; 
} 

これは私がこの作業をしようとしているテキストファイルですが、毎回置き換えようとしています。文字列を空白に置き換えます。あなたはwhileループ内でファイルのライン・バイ・ライン読んでいるキャプチャ・グループを変数として格納し、置換演算子は空白として戻しますか?

CREATE TABLE t_test                               
(
system_name  varchar(20) NOT NULL, 
server_type  smallint NOT NULL, 
chargeable_system bit NOT NULL, 
    bit NOT NULL 
) 
create unique clustered index host_idx on dbo.t_host (system_name, server_type, environment)                                                                                                                
create nonclustered index tt_host on dbo.t_host (N.A.) 
+0

ヒント: 'while(<>)'は引数として渡されたファイルから読み込むので、 'FILE'を開く必要はありません。 – ikegami

+0

@Gary私の答えに作業例を追加しました。 –

+0

@Thanks markus私はあなたがやったことを見て、人は私が取ったルートよりもはるかに効率的だそうです。私はファイルから行を読み込み、配列内に格納することにしました。次に、配列から読み込んで、変数内に格納する必要があるものを見つけ、配列から再度読み込み、必要なものを置き換えます。 – Gary

答えて

4

以下のように

CREATE TABLE t_test                               
(
system_name  varchar(20) NOT NULL, 
server_type  smallint NOT NULL, 
chargeable_system bit NOT NULL, 
chargeable_items bit NOT NULL 
) 
create unique clustered index host_idx on dbo.t_host (system_name, server_type, environment)                                                                                                                
create nonclustered index tt_host on dbo.t_host (N.A.) 

毎回、それは空白の値を持つ「chargeable_items」を置き換える置換演算子を行います。

はライン

chargeable_items bit NOT NULL 

で、あなたはまだ任意の値に$lineを設定していないので、chargeable_itemsは空の値に置き換えられます。あなただけの、その行の後にはchargeable_itemsがないので

create unique clustered index host_idx on dbo.t_host (system_name, server_type, environment) 

しかし$lineが、その後に使用されることはありませんライン上$line後に設定してください。

作業溶液を一度に全部のファイルを読むために、その後のマッチングと置換んだろう:<FILE>が全体読まれるように、

#!/approot/opt/bin/perl 
use strict; 

my $file = $ARGV[0]; 
open FILE, $file or die; 
local $/; 
my $data = <FILE>; 

if ($data =~ m/create unique clustered index \S+ on \S+ \(([^\)]+)\)/) { 
    my $line = $1; 
    $data =~ s/chargeable_items/$line/; 
} 

print $data; 

ここlocal $/セット特殊変数$/(入力レコードセパレータ)を未定義の値にローカル行単位ではなく一度にファイル化することができますが、これは正常な動作です。

関連する問題