-1

以下はコードです

$string = "any text
Affected area :
menu

Feature to test :

diagnostics
";

$string1=rindex($string,':');
print "$string1\n";

$string2=substr($string,$string1+1);
print "$string2";

上記のコードを使用して「テストする機能」の後に文字列を見つけることができますが、影響を受ける領域用の文字列を見つけたいです。メニュー。助けてください

4

2 に答える 2

1

これはある種のテストプログラムだと思います。これをこのように行うと、より意味がありますか?

use strict;
use warnings;

my $feature_to_test;
my $affected_area;
while ( my $line <DATA> ) {
    chomp $line;
    if ( $line =~ /^Affected area\s*:/i ) {
        for (;;) {  #Loop forever (until I tell you to stop i.e.)
            my $line = <DATA>;
            if ( $line !~ /^\s*$/ ) {
               $affected_area = $line;
               last;
            }
        }
    }
    if ( $line =~ /^Affected area\s*:/i ) {
        for (;;) {  #Loop forever (until I tell you to stop i.e.)
            my $line = <DATA>;
            if ( $line !~ /^\s*$/ ) {
               $affected_area = $line;
               last;
            }
        }
    }
    if ( $line =~ /^Feature to test\s*:/i ) {
        for (;;) {  #Loop forever (until I tell you to stop i.e.)
            my $line = <DATA>;
            if ( $line !~ /^\s*$/ ) {
               $feature_to_test = $line;
               last;
            }
        }
    }

}
else {
    print qq("Not a special line: "$line"\n);
}

__DATA__
any text
Affected area :
menu

Feature to test :

diagnostics

この方法の利点は、一度にレコード全体を解析しようとするのではなく、行ごとにテストできることです。さらに、ファイルが読み込まれる方法をより適切にエミュレートします。

split長いテキストを配列に分割するために使用することもできます。これは、行ごとに実行することもできます。

use strict;
use warnings;

my $string = "any text
Affected area :
menu

Feature to test :

diagnostics
";
my @string_list = split /\n/, $string;  #Now, this is split line by line
for my $line ( @string_list ) {
    print "same logic as above...\n";
}

これをループとして実行し、各行で読み取ると、ロジックが少しすっきりして理解しやすくなります。おそらくそれほど効率的ではありませんが、Perl で数百万行のファイルを読み取る場合でも、エコノボックス PC でも数秒しかかかりません。

于 2013-01-29T18:39:55.833 に答える
0

おそらく、肯定的な後読みとキャプチャを使用した正規表現がここで役立ちます。

use strict;
use warnings;

my $string = "any text
Affected area :
menu

Feature to test :

diagnostics
";

my ($area) = $string =~ /(?<=area :\n)(.+)/;

print $area;

出力:

menu
于 2013-01-29T18:01:38.733 に答える