0

は、配列全体ではなく、@main::match_to_array配列の最後の要素のみを出力します。@match_to_array

この SO リンクを参照してコードを作成しました。

入力 HTML は以下で構成されます。 dmit@sp.com ems@es.com dew@es.com dmit@sp.com erg@es.com

#!/usr/bin/perl –w

use strict;
use warnings;
use Cwd;

sub extractMail {

    my $perl_path = cwd;
    # Full HTML.htm
    if(-e 'test.html') { 

    open(OPENFILE, "$perl_path/test.html") or die "Unable to open file";

    }

    my @email = <OPENFILE>;
    close OPENFILE;

    foreach my $email (@email){

        if ($email =~ /regex to match data/{
        my $match = "$1\n";

        our @match_to_array = split ("\n",$match);

        } # end of if statement 

    } # end of foreach
} # end of subroutine extractMail


    for (my $a = 1;$a<=1;$a++){

    &extractMail;

    print @main::match_to_array;

    }
4

2 に答える 2

2

あなたは投稿を誤解しています。ポイントは、適切な場所で変数を宣言することです。この場合、おそらくreturnサブルーチンから値を取得する必要があります。また、配列に代入することで

@match_to_array = split /\n/, $match;

配列の以前の内容を上書きしています。push代わりに使用してください。

未テスト:

#!/usr/bin/perl –w

use strict;
use warnings;
use Cwd;

sub extractMail {
    my $perl_path = cwd;
    if (-e 'test.html') { 
        open my $OPENFILE, "$perl_path/test.html" or die "Unable to open file: $!";
    }

    my @match_to_array;
    while (my $email = <$OPENFILE>) {
        if ($email =~ /regex to match data/) {
            my $match = "$1\n";
            push @match_to_array, split /\n/, $match;
        }
    }
    return @match_to_array;
}


for my $i (1 .. 1) {
    my @match_to_array = extractMail();
    print "@match_to_array\n";
}
于 2013-05-07T04:41:09.273 に答える
0
my @email = <OPENFILE>;
close OPENFILE;

これらの行 @email に「dmit@sp.com ems@es.com ...」という 1 つの要素が含まれているため、これが問題になる可能性があります。

その後、あなたはこれをやっています:

foreach my $email (@email)

これは一度ループします。

$email = "dmit@sp.com ems@es.com ..."

次に、正規表現はすべて「dmit@sp.com」を削除し、リストの1つの要素のみが処理されるという結論に導きます。

分割を読んで、スペースで区切られたリストから配列を生成してみてください

于 2013-05-07T09:00:36.507 に答える