用于perl文件操作的正则表达式无法正常工作

时间:2016-12-16 05:58:23

标签: regex xml perl

我有一个xml文件包含数据:

 <get>9090</get><br>
 <setId>setIdHere</set>
 <mainId>121</mainId>

由于我没有使用任何外部lib /软件包,但是我需要使用I / O进行一些更改。

我需要使用setIdHere更改字符串something。请在下面找到perl代码:

my $filename="file1.xml";
my $idVal=3232;
open(my $fh , '>>' ,$fileName);
select $fh or die $!;
s/setIdHere/$idVal;
print;
select STDOUT;
close($fh);

上面的代码将值附加到最后,但我想用字符串setIdHere替换它。

我是新手,不知道上述代码有什么问题。

提前致谢。

2 个答案:

答案 0 :(得分:2)

首先,您的代码使用了一些异常过时的技术。 protected DataTable Group(DataTable _dt) { DataTable dTable = new DataTable(); dTable.Columns.Add("Region_Name", typeof(string)); dTable.Columns.Add("PercentComplete", typeof(Double)); var query = from row in _dt.AsEnumerable() group row by row.Field<string>("Region_Name") into grp select new { Region_Name = grp.Key, PercentComplete = grp.Average(r => r.Field<Double>("PercentComplete")) }; foreach (var grp in query) { dTable.Rows.Add(grp.Region_Name, grp.PercentComplete); } return dTable; } 具有全局影响,最好避免使用。

一般情况下,要编辑文件,您需要将其打开以进行阅读,将其读入,更改并再次将其写回。为了避免将整个文件拉入内存,文件可能非常大,您通常会逐行执行此操作。

你不能写入你正在阅读的同一个文件(嗯,你可以,但它会弄得一团糟),所以你写一个临时文件然后当你完成重命名为原来的

select $fh

HOWEVER 您正在编辑XML。 XML是结构化的,您不应该尝试使用正则表达式来读取和编辑它。您需要使用XML::LibXMLXML::Twig等XML库来解析它。

你说你不能使用任何外部库,但我敢打赌你可以,这只是弄清楚如何。如果你这样做,你会有更轻松的时间。通常原因是您没有管理员权限。最简单的解决方案是安装perlbrew并安装您自己可以管理的Perl副本。 Perlbrew让这很容易。

答案 1 :(得分:1)

never ever use regular expressions to parse XM L。 XML是上下文的,而正则表达式则不是。因此,只有曾经成为一个肮脏的黑客。

如果您需要修改XML文件,我建议XML::Twig。它支持xpath,它与类似正则表达式,但本质上处理上下文问题。

XML::Twig也可以使用'parsefile_inplace'来编辑你的文件:

#!/usr/bin/env perl

use strict;
use warnings;

use XML::Twig;

sub modify_setId {
    my ( $twig, $setId ) = @_;
    $setId -> set_text('3232');
    $twig -> flush; 
}

my $twig = XML::Twig -> new ( twig_handlers => { 'setId' => \&modify_setId } );
$twig -> set_pretty_print('indented'); 
$twig -> parsefile_inplace('test.xml');