3

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

3 回答 3

8

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

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

于 2012-10-16T09:43:29.393 回答
4

这部分不应该:

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

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

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

因此,您的正则表达式可能如下所示:

$line =~ m#<(?:ExternalPage about|link r:resource)="([^"]+)"/?>#
于 2012-10-16T09:44:27.570 回答
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; 
于 2012-10-16T09:44:44.360 回答