小写XML标记

小写XML标记,xml,perl,Xml,Perl,我有两组XML文档,一组带有大写标记,另一组带有小写标记,因此我试图编写一个Perl程序,将第二组中的所有标记都小写 #!/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) {

我有两组XML文档,一组带有大写标记,另一组带有小写标记,因此我试图编写一个Perl程序,将第二组中的所有标记都小写

#!/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";}


 }
#/usr/bin/perl
严格使用;
使用诊断;
使用特征“说”;
我的$filename;
my@filenames=glob(“*.xml”);
我的$FH;
我的$lcCapture;
我的美元行;
我的$match;
foreach$filename(@filename){

open($FH,通常,您应该使用XML解析器,但在像您这样的有限情况下,正则表达式可能很好。您的问题是对错误的变量执行替换。更改:

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


您还可以使用Perl流编辑功能:

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

此解决方案将只对标记进行小写,而不会对其所包含的内容进行小写。

谢谢,这就像做梦一样。您能解释一下替换的最后一部分吗?这一位:
\L$&
\L
是一个修饰符,它可以将其后的任何字符串转换为小写。
$&
包含最新的匹配项。您可以阅读更多信息关于他们:
perl -pe 's/<\/?[^>]+>/\L$&/g' file.xml