Perl заменить несколько строк - PullRequest
1 голос
/ 26 октября 2010

У меня есть файл, который выглядит следующим образом:

<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 и Query, которые я получил из командной строки.

Как использовать условиесопоставить и заменить?

$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...
}

Ответы [ 2 ]

2 голосов
/ 26 октября 2010

XML не является обычным языком. Вы не должны относиться к ней как таковой Используйте один из прекрасных парсеров XML, доступных для Perl.Хорошим способом может быть использование XML :: Twig.Вот учебник: http://www.xml.com/pub/a/2001/03/21/xmltwig.html.

0 голосов
/ 26 октября 2010

Вот путь:

#!/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>
...