3

に現在含まれているものの 3 つの連続したコピーに一致するパターンを作成し$whatます。つまり、 である場合、パターンは と一致する必要$whatがあります。が の場合、パターンは、、、または他の多くのバリエーションと一致する必要があります。(ヒント:のようなステートメントでパターン テスト プログラムの先頭に設定する必要があります)fredfredfredfred$whatfred|barneyfredfredbarneybarneyfredfredbarneybarneybarney$whatmy $what = 'fred|barney';

しかし、これに対する私の解決策は簡単すぎるので、間違っていると思います。私の解決策は次のとおりです。

#! usr/bin/perl
use warnings;
use strict;


while (<>){
chomp;

if (/fred|barney/ig) {
    print "pattern found! \n";
}
}

それは私が欲しいものを表示します。パターンを変数に保存する必要さえありませんでした。誰かがこれを通して私を助けることができますか? または、問題を間違って理解している場合は教えてください。

4

2 に答える 2

2

この例は、ソリューションの問題点を明確にするはずです。

my @tests = qw(xxxfooxx oofoobar bar bax rrrbarrrrr);
my $str = 'foo|bar';

for my $test (@tests) {
    my $match = $test =~ /$str/ig ? 'match' : 'not match';
    print "$test did $match\n";
}

出力

xxxfooxx did match
oofoobar did match
bar did match
bax did not match
rrrbarrrrr did match 

解決

#!/usr/bin/perl

use warnings;
use strict;

# notice the example has the `|`. Meaning 
# match "fred" or "barney" 3 times. 
my $str = 'fred|barney';
my @tests = qw(fred fredfredfred barney barneybarneybarny barneyfredbarney);

for my $test (@tests) {
    if( $test =~ /^($str){3}$/ ) {
        print "$test matched!\n";
    } else {
        print "$test did not match!\n";
    }
}

出力

$ ./test.pl
fred did not match!
fredfredfred matched!
barney did not match!
barneybarneybarny did not match!
barneyfredbarney matched!
于 2013-05-08T04:22:08.290 に答える
1
use strict;
use warnings;

my $s="barney/fred";
my @ra=split("/", $s);
my $test="barneybarneyfred"; #etc, this will work on all permutations

if ($test =~ /^(?:$ra[0]|$ra[1]){3}$/)
{
    print "Valid\n";
}
else
{
    print "Invalid\n";
}

分割は、「/」に基づいて文字列を区切りました。(?:$ra[0]|$ra[1]) はグループを示しますが、「barney」または「fred」を抽出しません。{3} は正確に 3 つのコピーを示します。大文字と小文字を区別しない場合は、"/" の後に i を追加します。^ は「で始まる」ことを示し、$ は「で終わる」ことを示します。

編集: 形式を barney\fred にする必要がある場合は、次を使用します。

my $s="barney\\fred";
my @ra=split(/\\/, $s);

マッチングが常に fred と barney で行われることがわかっている場合は、$ra[0]、$ra[1] を fred と barney に置き換えるだけです。

于 2013-05-08T04:11:25.463 に答える