Perl while循环重复自己

时间:2012-10-16 09:37:56

标签: perl loops while-loop

我是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; 

3 个答案:

答案 0 :(得分:8)

您的打印件位于while循环中。听起来你想要将你的打印移到循环之外。

或者,如果您想要在浏览每一行时打印每个网址,请移动&#34; my @ urls&#34;进入循环,然后它将重置每一行

答案 1 :(得分:4)

不应该这部分:

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

...被置于while循环之外?在while内没有任何意义,因为@urls在那里显然是不完整的。

与两个与正则表达式相关的注释:首先,使用m运算符,您可以选择另一组分隔符,这样您就不必转义/符号;第二,没有必要在字符类定义中转义"符号。事实上,除非你选择这个字符作为分隔符,否则它根本不需要在正则表达式中逃避它。 )

所以你的正则表达式可能是这样的:

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

答案 2 :(得分:2)

你在其他地方需要@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;