2016-08-11 28 views
0

匹配修改字符模式

後,我差不多20年前這樣做,所以我忘記了很多關於Perl和我沒有找到從谷歌的答案。

我與形式

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

多次十大DB create hash index語句的文件我有抱着期望的值表名稱鍵控散列「頁= ###」。

我已經正確地將行讀入到字符串變量中,並且我需要知道如何將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

提取模式名稱

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

替換爲以下數pages=

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

這適用於對線的結構的幾個假設 - 即架構名稱只包含上限或下劃線,並且這些數字跟着=沒有空格。


一種更好的方式,通過Borodin在註釋

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

\K提供是正回顧後(?<=pattern)的特定形式中,一個零寬度斷言該給定的模式之前目前的比賽位置。此表格也放棄了以前的所有匹配,因此上面的替換不會觸及pages=部分。因此不需要任何捕獲組。請參閱lookaround斷言in perlretut\Kin perlre(向下滾動一下)。

+0

或's/pages = \ K#+/$ number_replacement /' – Borodin

+0

@Borodin哦,是的,非常棒:)'\ K'的完美使用 - 同時清理它! – zdim