2016-03-04 145 views
1

我有兩組XML文檔,一個帶有大寫標籤,另一個帶有小寫字母,所以我試圖編寫一個Perl程序來降低第二組中的所有標籤。降低XML標籤

#!/usr/bin/perl 
use strict; 
use diagnostics; 
use feature 'say'; 
my $filename; 
my @filenames = glob ("*.xml"); 
my $FH; 
my $lcCapture; 
my $row; 
my $match; 


foreach $filename (@filenames) { 
    open ($FH, '<:encoding(UTF-8)', $filename) 
    or die "Could not open file '$filename' $!"; 
} 

    while ($row = <$FH>) { 
     chomp $row; 

     if ($row =~ m/(?:<\/?([A-Z]+)>)/) { 
     $match = $1; 
     $lcCapture = lc $match; 
     $match =~ s/$match/$lcCapture/g; 
    } 
     {no warnings; 
     print "$row\n";} 


} 

但我只是無法弄清楚問題可能是什麼。我已經解決了XSLT的問題。但是我希望我的Perl程序能夠正常工作!

回答

0

您也可以使用Perl流的編輯功能:

perl -pe 's/<\/?[^>]+>/\L$&/g' file.xml 

該解決方案將只小寫標籤,而不是被他們包圍。

+0

謝謝,這就像一個夢想。你能解釋一下這個替代的最後一部分嗎?這個位:'\ L $&' – StuporUser

+0

'\ L'是一個修飾符,它將後面的任何字符串變成小寫。 '$&'包含最近的比賽。您可以在這裏閱讀更多關於它們的信息:http://perldoc.perl.org/perlre.html – bart

2

一般來說,您應該使用XML解析器,但在像您這樣的有限情況下,正則表達式可能會很好。你的問題是你在錯誤的變量上執行替換。變化:

$match =~ s/$match/$lcCapture/g; 

到:

$row =~ s/$match/$lcCapture/g;