【问题标题】:Perl while loop is repeating itselfPerl while循环正在重复自己
【发布时间】:2012-10-16 09:37:55
【问题描述】:

我是 Perl 的 100% 新手,但确实有一些 PHP 知识。我正在尝试创建一个快速脚本,该脚本将采用 @url 变量并将其保存到 .txt 文件中。我遇到的问题是每次遍历循环时都会再次保存 url,这非常烦人。所以当循环运行时,它看起来像这样。

url1.com
url1.com url2.com
url1.com url2.com url3.com 

我希望它看起来很简单:

url1.com
url2.com
url3.com

这是我的代码。如果有人可以提供帮助,我将非常感激!

#!/usr/bin/perl
use strict;
use warnings;

my $file = "data.rdf.u8";
my @urls;

open(my $fh, "<", $file) or die "Unable to open $file\n";

while (my $line = <$fh>) {

    if ($line =~ m/<(?:ExternalPage about|link r:resource)="([^\"]+)"\/?>/) {
        push @urls, $1;
    }

    open (FH, ">>my_urls.txt") or die "$!";
    print FH "@urls ";
    close(FH);
}

close $fh; 

【问题讨论】:

  • 在格式正确的open 上做得很好,带有die 异常,但是将 OS 错误 变量合并到 die 字符串中非常有用解释失败的原因。另外,如果你省略了die 字符串末尾的换行符,那么 Perl 将添加上下文信息来说明异常发生在哪个源文件中

标签: perl loops while-loop


【解决方案1】:

你的 print 在你的 while 循环中。听起来您想将打印移出循环。

或者,如果您想在遍历每一行时打印每个 url,请将“my @urls”的声明向下移动到循环中,然后它将重置每一行

【讨论】:

    【解决方案2】:

    这部分不应该:

    open (FH, ">>my_urls.txt") or die "$!";
    print FH "@urls ";
    close(FH);
    

    ...放在while 循环之外?在while 中没有任何意义,因为@urls 显然在那里不完整。

    还有两个与正则表达式相关的旁注:首先,使用m 运算符,您可以选择另一组分隔符,这样您就不必转义/ 符号;其次,不必在字符类定义中转义" 符号。实际上,根本不需要在正则表达式中对其进行转义 - 除非您选择此字符作为分隔符。 )

    所以你的正则表达式可能如下所示:

    $line =~ m#<(?:ExternalPage about|link r:resource)="([^"]+)"/?>#
    

    【讨论】:

      【解决方案3】:

      你在别处需要@urls 数组吗?因为否则,您可以简单地:

      #!/usr/bin/perl
      use strict;
      use warnings;
      
      my $file = "data.rdf.u8";
      my @urls;
      
      open(my $fh, "<", $file) or die "Unable to open $file\n";
      open (FH, ">>my_urls.txt") or die "$!";
      while (my $line = <$fh>) {
          if ($line =~ m/<(?:ExternalPage about|link r:resource)="([^\"]+)"\/?>/) {
      
            print FH $1;
      
          }
      
      
      
      }
      close(FH);
      close $fh; 
      

      【讨论】:

      • +1 用于说明合理的方法,但我建议修复不一致之处(如FH$fh)——因为它现在是您的代码。 )
      • 你是对的 - 我想添加尽可能少的修改
      • 感谢简单干净的代码。我现在唯一的问题是我如何留下一个空白空间,所以它打印为 url1 url2 url3 因为现在它打印为 url1url2url3。我只是在 $1 之后添加 \n 吗?抱歉,我是 perl 的新手。
      • @user1701252 print FH $1,"\n";
      • @BradGilbert 感谢您的快速回复。谢谢大家。一切正常:)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-04
      • 2014-03-23
      • 2014-11-14
      • 2013-05-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多