2010-10-26 36 views
1

我有一个文件,它看起来像:perl的替代多行

<QUERY name="Secondary"> 
      <SQLStmt>select * from my_tb; 
      </SQLStmt> 
<QUERY name="primary"> 
      <SQLStmt>select * from my_tb; 
      </SQLStmt> 

<QUERY name="last"> 
      <SQLStmt>select * from my_tb; 
      </SQLStmt> 

我需要与其他一些SQLStmnts和查询的名字,我从收到命令行来替代SQLStmnts。

如何使用条件进行匹配和替换?

$qury_nm=shift; 
$sqlstmt=shift; 
undef $/; 
if(/<QUERY name="$qury_nm">(.*)<SQLStmt>(.*)<\SQLStmt>/) 
{ 
    #need help here!! 
    substitute the matched qury_nms SQLStmt wth the $sqlstmt and write it into the same file... 
} 
+0

http://codepad.org/ekwVuA5U 请参阅此链接以获得更好的视图 – Nachikethas 2010-10-26 13:31:20

+0

我不认为“推”命令做你认为它的作用:-) – 2010-10-26 14:04:48

+0

ooh ..it应该转移而不是推... 改变了:) – Nachikethas 2010-10-26 14:37:16

回答

0

这里有很长的路要走:

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

my $qury_nm = 'primary'; 
my $sqlstmt = 'SELECT col1,col2 FROM table2'; 
undef $/; 
my $str = <DATA>; 

$str =~ s!(<QUERY name="$qury_nm">.*?<SQLStmt>).*?(</SQLStmt>)!$1$sqlstmt$2!s; 
say $str; 

__DATA__ 
<QUERY name="Secondary"> 
      <SQLStmt>select * from my_tb; 
      </SQLStmt> 
<QUERY name="primary"> 
      <SQLStmt>select * from my_tb; 
      </SQLStmt> 

<QUERY name="last"> 
      <SQLStmt>select * from my_tb; 
      </SQLStmt> 

输出:

<QUERY name="Secondary"> 
      <SQLStmt>select * from my_tb; 
      </SQLStmt> 
<QUERY name="primary"> 
      <SQLStmt>SELECT col1,col2 FROM table2</SQLStmt> 

<QUERY name="last"> 
      <SQLStmt>select * from my_tb; 
      </SQLStmt>