3

制作一个匹配三个连续副本的模式,该副本当前包含在$what. 也就是说,如果$whatfred,你的模式应该匹配fredfredfred。如果$whatfred|barney,您的模式应该匹配fredfredbarney, barneyfredfred,barneybarneybarney或许多其他变体。(提示:您应该$what在模式测试程序的顶部设置类似的语句my $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} 表示正好三个副本。如果大小写无关紧要,在结束的“/”后添加一个 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 回答