如何在同一个xml行中在Perl中替换相同的单词?

时间:2013-03-18 11:58:02

标签: perl if-statement substitution uppercase

我正在处理XML文档,我需要打开它并在同一行上转换为大写某些特定标记值。如果我有相同的单词,它只替换其中一个,虽然我使用两个不同的if循环: 这是我的XML:

<pageID="1" width="827" height="1169" Sender_Company="société" Sender_Address="société" Sender_Fax="" Category="C2" Language_2="" Document_Object="" Language_1="french" Language_3="" NumPage="1" Script_1="typed">

这是我的代码:

while (<FILEIN>) {
    if ($_ =~ /pageID="1"/) {
        $haschanged = 1;
        if ($_ !~ /Sender_Address=""/) {
            if ($_ =~ /(Sender_Address="(.*?)")/){
                my $SenderAddress = $2;
                $SenderAddress = uc($SenderAddress);
                $_ =~ s/$1/Sender_Address="$SenderAddress"/;
            }
        }

        if ($_ !~ /Sender_Company=""/) { 
            if ($_ =~ /(Sender_Company="(.*?)")/) { 
                my $SenderCompany = $2;
                $SenderCompany = uc($SenderCompany);
                $_ =~ s/$1/Sender_Company="$SenderCompany"/;
                #print "$_\n";
            }
        }
    }
}

当我为Sender_Company="bla"Sender_Address="société"使用两个不同的值时,转换为大写有效,但在本案例中我使用相同的单词Sender_Company="société"Sender_Address="société"时它不会转换为大写。 有没有人有任何想法?当我一次使用两个不同的if循环时,我找不到它背后的逻辑,不想变换同一个单词。谢谢!

1 个答案:

答案 0 :(得分:2)

您对XML的理解有点值得商榷:

  1. 那不是XML。它最多是一个XML片段(元素未关闭,标记名称不能像<pageID="1">那样加倍,没有<?xml ...?>声明,没有根元素,...)
  2. 不要用正则表达式解析XML; - )
  3. XML没有“行”的概念。
  4. 除此之外,代码应该可以正常工作。请注意,您可以简化生活,缩短代码:

    1. $_ =~ /foo//foo/相同,$_ !~ /foo/!/foo/相同。
    2. 您只需一步即可完成所有操作,而不是提取两个捕获,并将结果替换为第二个正则表达式:

      s{ (?<=Sender_Address=") ([^"]+) (?=") }{ uc $1 }ex
      
      等等,什么?我提取了一个或多个非“ - 字符,前面跟着字符串Sender_Address=",然后是"(环顾四周的断言)。我捕获之间的东西,用大写字母替换它因为我匹配至少一个字符,所以我不必测试空标签的情况。/e标志允许替换中的代码(这里不是必需的),而/x允许我们要包含不匹配的空格以便更好地格式化。

      您可以为想要大写的两个属性轻松扩展它:

      # This subsumes your whole logic inside `if (/pageID="1"/)`
      $haschanged = 1;
      for my $attr (qw/Sender_Address Sender_Company/) {
        s{ (?<=\Q$attr\E=") ([^"]+) (?=") }{ uc $1 }ex;
      }
      

      \Q...\E导致插值的东西按字面意思匹配,即使它包含的字符也是正则表达式元字符。

    3. 还有一些漏洞:

      1. 您未能将以实体形式提供的大写字符设为大写。
      2. XML允许将单引号'...'用作标记值分隔符。你不处理它们
      3. 请参阅您对XML的了解 ...
      4. 下的要点

        所有这些都可以通过使用XML解析器,然后转换DOM中的属性来解决。