【问题标题】:How do I make this "Use of uninitialized value" warning go away?如何使此“使用未初始化值”警告消失?
【发布时间】:2008-09-25 21:15:20
【问题描述】:

假设我想编写一个正则表达式将所有<abc><def><ghi> 标签更改为<xyz> 标签。我还想将它们的结束标签更改为</xyz>。这似乎是一个合理的正则表达式(忽略反引号;如果我不包含小于号,StackOverflow 会遇到问题):

`s!<(/)?(abc|def|ghi)>!<${1}xyz>!g;`

而且它也有效。唯一的问题是,对于打开标签,可选的 $1 变量被分配为 undef,因此我收到“使用未初始化的值...”警告。

解决此问题的优雅方法是什么?我宁愿不把它变成两个单独的正则表达式,一个用于打开标签,另一个用于结束标签,因为这样需要维护两个 taglist 副本,而不仅仅是一个。

编辑:我知道我可以在代码的这个区域关闭警告,但我不认为“优雅”。

【问题讨论】:

  • 对于小于号,请尝试使用

标签: regex perl


【解决方案1】:

在捕获括号内移动问号。这样 $1 将始终被定义,但可能是一个零长度的字符串。

【讨论】:

    【解决方案2】:

    怎么样:

    `s!(</?)(abc|def|ghi)>!${1}xyz>!g;`
    

    【讨论】:

      【解决方案3】:

      s!&lt;(/?)(abc|def|ghi)&gt;!&lt;${1}xyz&gt;!g;

      唯一的区别是改变“(/)?”到 ”(/?)”。您已经确定了几个功能解决方案。我想,这个有你所要求的优雅。

      【讨论】:

        【解决方案4】:

        这是一种方法:

           s!<(/?)(abc|def|ghi)>!<$1xyz>!g;
        

        更新:删除了关于使用 (?:pattern) 的无关评论。

        【讨论】:

          【解决方案5】:

          您可以将您的第一个匹配项设为(&lt;/?),并去掉“替换”一侧的硬编码&lt;。那么 $1 总是有&lt;&lt;/。可能有更优雅的解决方案来解决警告问题,但这个应该处理实际问题。

          【讨论】:

            【解决方案6】:

            要让正则表达式在任何一种情况下都捕获 $1,请尝试:

              s!<(/|)?(abc|def|ghi)>!<${1}xyz>!g;
                   ^
                   note the pipe symbol, meaning '/' or ''
            

            对于 '',这将捕获 '' 之间的 '',对于 '',捕获 '' 之间的 '/'。

            【讨论】:

            • 你仍然应该从括号后面去掉问号
            • tye 的意思是,在保证始终匹配某些内容的组后面加上问号是没有意义的。所以要么你写它(/?)或(/|)——两者都会产生相同的效果——但不是(/|)? – 因为问号是多余的。
            【解决方案7】:

            我不想把它分成两部分 单独的正则表达式,一个用于打开标签 另一个用于结束标签,因为 然后有两个副本 需要维护的taglist

            为什么?将您的 taglist 放入一个变量中,并将该变量插入到您喜欢的任意数量的正则表达式中。我什至会考虑使用单个正则表达式,因为复杂的正则表达式更具可读性(什么正则表达式不复杂?)。

            【讨论】:

              【解决方案8】:

              要小心,因为 HTML 比乍一看要难一些。例如,是否要将“”更改为“”?你的正则表达式不会。是否要更改“'>”?正则表达式会。相反,您可能想做这样的事情:

              use HTML::TreeBuilder;
              my $tree=HTML::TreeBuilder->new_from_content("<abc>asdf</abc>");
              for my $tag (qw<abc def ghi>) {
                for my $elem ($tree->look_down(_tag => $tag)) {
                  $elem->tag('xyz');
                }
              }
              print $tree->as_HTML;
              

              这使您不必自己进行繁琐的 HTML 解析。

              【讨论】:

                【解决方案9】:

                添加

                no warnings 'uninitialized';
                

                s!<(/)?(abc|def|ghi)>! join '', '<', ${1}||'', 'xyz>' !ge;
                

                【讨论】:

                  猜你喜欢
                  • 2010-09-13
                  • 1970-01-01
                  • 2017-11-24
                  • 2021-04-15
                  • 2013-12-29
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多