3

Perl はまったくの初心者ですが、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

そして、2つの正規表現関連の補足事項:最初に、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 に答える