Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl部分匹配 请考虑下面的脚本,我想匹配$B到$A,即使$B是部分匹配。 这能做到吗 $a="MCF-7"; $b="MCF"; if($b=~m/$a/i) { print "FOUND"; }_Perl - Fatal编程技术网

Perl部分匹配 请考虑下面的脚本,我想匹配$B到$A,即使$B是部分匹配。 这能做到吗 $a="MCF-7"; $b="MCF"; if($b=~m/$a/i) { print "FOUND"; }

Perl部分匹配 请考虑下面的脚本,我想匹配$B到$A,即使$B是部分匹配。 这能做到吗 $a="MCF-7"; $b="MCF"; if($b=~m/$a/i) { print "FOUND"; },perl,Perl,您似乎把$a和$b混在了一起: use strict; use warnings; my $a="MCF-7"; my $b="MCF"; if($a=~/$b/i) #tests for case-insensitive matching of $b within $a. { print "Found\n"; } 您问题中的代码没有产生任何输出,因为“MCF-7”中没有匹配的“MCF-7”,而正则表达式可以做到这一点,听起来您的问题也可以通过index函数解决: say index($ha

您似乎把
$a
$b
混在了一起:

use strict;
use warnings;
my $a="MCF-7";
my $b="MCF";
if($a=~/$b/i) #tests for case-insensitive matching of $b within $a.
{
 print "Found\n";
}

您问题中的代码没有产生任何输出,因为
“MCF-7”
中没有匹配的
“MCF-7”

,而正则表达式可以做到这一点,听起来您的问题也可以通过
index
函数解决:

say index($haystack, $needle) >= 0 ? 'match' : 'fail'; # any position
say index($haystack, $needle) == 0 ? 'match' : 'fail'; # anchored at start
index
函数区分大小写。如果需要不敏感的匹配,请对这两个参数应用
uc
lc
函数

尽管
index
函数比正则表达式快得多,但如果您确实需要正则表达式解决方案,可以构建一个正则表达式生成器,生成一系列交替,以执行部分匹配

sub build_partial {
    my ($str, $min) = (@_, 1);
    my @re;
    for (0 .. length($str) - $min) {
        my $str = substr $str, $_;
        for ($min .. length $str) {
            push @re, quotemeta substr $str, 0, $_
        }
    }
    my $re = join '|' => sort {length $a <=> length $b} @re;
    qr/^(?:$re)$/i
}

my $haystack = 'MCF-7';
my $needle   = 'MCF';

my $regex = build_partial $haystack;

say $needle =~ /$regex/ ? 'match' : 'fail'; # match
即使针是干草堆中的单个字符,它也会匹配<代码>build_partial采用一个可选数字,指示匹配所需的最小长度:

my $regex_3 = build_partial $haystack, 3;
生成此正则表达式的:

/^(?:MCF|CF\-|F\-7|MCF\-|CF\-7|MCF\-7)$/i
这些模式匹配从任何位置开始的子字符串。如果希望将其锚定到字符串的前面,
build\u partial
会变得更简单一些:

sub build_partial {
    my ($str, $min) = (@_, 1);

    my $re = join '|' => map {
        quotemeta substr $str, 0, $_
    } $min .. length $str;

    qr/^(?:$re)$/i
}

你就不能改变这种感觉吗<如果$a=~/$b/i,则代码>打印“已找到”?我喜欢这种方法,尽管我想知道为什么你使用
join'|'=>
而不是
join'|',
@flesk=>只是个人编码偏好。我倾向于在任何时候使用胖箭头,它在参数之间绘制有用的关系。因此,
join'=>@list
而不是
push@array=>@list
,因为这是向后的
sub build_partial {
    my ($str, $min) = (@_, 1);

    my $re = join '|' => map {
        quotemeta substr $str, 0, $_
    } $min .. length $str;

    qr/^(?:$re)$/i
}