2016-08-11 7 views
0

マッチングは、パターン

後、私は、ほぼ20年前にこれをしなかったので、私は、Perlについて多くを忘れてしまったと私はGoogleからの答えを見つけていませんよ。

私は、「ページ= ###」のための所望の値を保持するテーブル名をキーとするハッシュを持っているフォームの多くは10倍DB create hash index

create unique hash index on MYSCHEMA.MYTABLE (Col1, Col2) pages=####; 
create hash index on MYSCHEMA.ANOTHER_TABLE (Col1, Col2) pages=####; 

でファイルを持っています。

私は文字列変数に行を正しく読み込んだので、変数にindex on MYSCHEMA.の後にテーブル名を取得する方法を知る必要があります。

また、pages=####の番号を置き換えるにはどうすればよいですか?

答えて

4

リストコンテキストで一致を使用してテーブル名を抽出します。

#!/usr/bin/perl 
use warnings; 
use strict; 

my @lines = (
    "create unique hash index on MYSCHEMA.MYTABLE (Col1, Col2) pages=####;\n", 
    "create hash index on MYSCHEMA.ANOTHER_TABLE (Col1, Col2) pages=####;\n" 
); 

my %pages = (MYTABLE => 12, 
       ANOTHER_TABLE => 42, 
); 

for my $line (@lines) { 
    my ($table) = $line =~ /index on MYSCHEMA\.(\w+)/; 
    $line =~ s/pages=####/pages=$pages{$table}/; 
    print $line; 
} 
4

これはラインの構造についてのいくつかの前提で動作しますpages=

$line =~ s/(pages=)(#+)/$1$number_replacement/; 

次の番号を交換してスキーマ名

my ($schema_name) = $line =~ s/MYSCHEMA\.([A-Z_]+)/; 

を抽出 - そのスキーマ名は大文字が含まれていますまたはアンダースコアで、数字は空白なしで=に従います。コメント

 
$line =~ s/pages=\K#+/$number_replacement/; 

\KBorodinによって提供


良い方法は、所定のパターンが先行していることゼロ幅アサーション正後読み(?<=pattern)の特定の形態であります現在のマッチ位置。このフォームでは以前のすべての一致も破棄されるため、上記の置換はpages=部分には適用されません。したがって、キャプチャグループは必要ありません。見回りアサーションin perlretut\Kin perlre(少しスクロールダウン)を参照してください。

+0

または 's/pages = \ K#+/$ number_replacement /' – Borodin

+0

@Borodinああ、はい、素晴らしい:) '\ K'の完璧な使い方です。 – zdim