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