【问题标题】:Delete lines in perlperl中删除行
【发布时间】:2011-11-16 19:13:32
【问题描述】:

我是 perl 新手,之前没有任何其他编程语言的编程经验。我正在尝试使用 do-while 循环删除/跳过几行。我正在尝试删除/跳过两个标签之间的数据:<worker></workers>

代码:

if($work=/^<worker>/)
{
   do
       {
         delete $work[$i];
                  ++$i;
                     }
       print $work,"\n";
}

【问题讨论】:

  • $work 是如何声明的?是数组吗?
  • 该代码中没有“do-while”循环。
  • if($work=/^&lt;worker&gt;/) 中的等号= 可能是绑定运算符=~。此外,不推荐在数组上使用delete
  • Insted of delete $work[$i] 你可能想要splice(@work, $i, 1) 或类似的东西,具体取决于$i 的初始值。
  • 根据数据的大小,您可能想尝试使用模块XML::Simple 来帮助您解决问题。

标签: perl


【解决方案1】:

我假设您想跳过标签 &lt;workers&gt;&lt;/workers&gt; 之间的数据。您需要在正则表达式中使用 ..

这是一个可以做到的班轮

perl -ne 'print unless /<workers>/../<\/workers>/' <file_name>

如果你想在脚本中做,从文件中读取一行后添加这一行

next if /<worker>/../<\/workers>/;

您可以从 brian d foy

的这个非常好的 presentation 开始 perl

【讨论】:

  • 感谢您的快速帮助。我还有一个问题,例如我有 ABNDFD 如何打印 ABNDFD
  • @nandini 看起来您正在解析 xml 文件,我建议您使用 XML::simple 之类的模块,您可以使用它读取 xml 并将其转换为哈希。无论如何,对于您的问题,答案是使用正则表达式。 if($line =~ /&lt;A&gt;(.*?)&lt;\/A&gt;/) {$var = $1;} $var 将包含两个标签之间的所有内容。我强烈建议阅读我在答案中提到的演示文稿,所有这些对你来说都是微不足道的
  • 非常感谢,我一定会仔细阅读您提到的演示文稿
【解决方案2】:
while (<>) {
  print unless m|<worker>| .. m|</workers>|;
}

在不同的标签上开始和结束似乎有点奇怪。他们应该都是“工人”还是“工人”?

【讨论】:

    【解决方案3】:

    我假设你有这样的数据:

    my $x = <<END;
    
    Text to keep
    <worker> text to be deleted </worker>
    Text to keep again
    <worker>
    Text to be deleted
    </worker>
    END
    

    如果你也想删除&lt;worker&gt;&lt;/worker&gt; 标签:

    $x =~ s/<worker>.*?<\/worker>//g;
    

    如果需要保留标签:

    $x =~ s/<worker>.*?<\/worker>/<worker><\/worker>/g;
    

    但是,这只有在您可以保证&lt;worker&gt; 标记不嵌套时才有效。以下字符串将导致错误:

    <worker> lalala <worker> bababa </worker> lalala </worker>
    

    要真正安全地完成这项工作,您需要使用解析模块,例如 HTML::TreeBuilderXML::Twig

    【讨论】:

    • 这很有帮助,还有 1 个问题?如何在两个 html 标签之间打印术语。例如- ABCFE 如何只打印 ABCFE
    • $text =~ /&lt;A&gt;(.*?)&lt;\/A&gt;/si; print $1
    • @yko--非常感谢,感谢您的帮助
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多