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