2016-12-16 72 views
0

我有一個xml文件Perl的文件操作包含數據的一樣:正則表達式中不工作

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

由於我沒有使用任何外部的lib /包,但我需要做的使用我的一些變化/ O。

我需要改變串setIdHeresomething。請看以下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來取代它。

我是新來的perl不知道上面的代碼有什麼問題。

在此先感謝。

+0

您的代碼不編譯。它也從不讀取文件。你可以複製和過去的真實代碼? – Schwern

回答

2

請,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'); 
3

首先,您的代碼使用了一些非常過時的技術。 select $fh具有全球效應,最好避免。

一般編輯,你需要打開它進行閱讀,閱讀它,改變它,和它再次寫回的文件。爲了避免將整個文件拖入內存中,文件可能非常大,您通常一行一行地執行此操作。

你不能寫你從讀取相同的文件(當然,你可以,但它使一個爛攤子),所以不是你寫到一個臨時文件,然後當你完成重命名是原版的。

# This forces you to declare all variables protecting against typos 
use strict; 
# This lets you know when you've done something you probably shouldn't. 
use warnings; 
# This will error if file operations failed, no more "or die $!" 
use autodie; 

my $file = "file1.xml"; 
my $tmp = $file.".new"; # file1.xml.new 

open my $in, "<", $file; # open the XML file for reading 
open my $out, ">", $tmp; # open a temp file for writing 

# Read the file line by line 
while(my $line = <$in>) { 
    # Change the line. 
    $line =~ s{this}{that}g; 

    # Write it to the temp file. 
    print $out $line; 
} 

# If you don't do this, it might not have finished writing. 
close $out; 
close $in; 

# Overwrite the old file with the new one. 
rename $temp, $file; 

無論其您正在編輯XML。 XML是結構化的,你不應該嘗試用正則表達式來閱讀和編輯它。您需要使用像XML::LibXMLXML::Twig這樣的XML庫進行解析。

你說你不能使用任何外部庫,但我敢打賭,你就可以了,它只是一個搞清楚如何的問題。如果你這樣做,你會有一個更容易的時間。通常原因是您沒有管理員權限。最簡單的解決方案是安裝perlbrew並安裝您可以管理的Perl自己的副本。 Perlbrew使這很容易。

+0

請不要推薦['XML :: Simple'](http://stackoverflow.com/questions/33267765/why-is-xmlsimple-discouraged) - 即使它的文檔建議使用別的東西。 'XML :: LibXML'和'XML :: Twig'都是更好的選擇。 – Sobrique

+0

@Sobrique Okie doke。 – Schwern