perl分组事物和分层匹配

时间:2016-03-07 12:23:12

标签: perl

我一直在测试Perl正则表达式代码perlrequick部分Grouping things and hierarchical matching

中写的内容

这是我的Perl代码

my $t = "housecats";
my ($m) = $t =~ m/house(cat|)/;
print $m; 

输出 cat ,但应该如文档

中所述
/house(cat|)/;  # matches either 'housecat' or 'house'

有什么问题?有什么不妥吗?

3 个答案:

答案 0 :(得分:1)

你可能误解了评论。这意味着

for my $t (qw( housecats house )) {
    my ($m) = $t =~ /house(cat|)/;
    print "[$m]\n";
}

将打印

[cat]
[]

即。正则表达式将匹配housecathouse。如果模式完全不匹配,则$m将为undef

答案 1 :(得分:1)

您使用此代码做了什么

my $t = "housecats";
my ($m) = $t =~ m/house(cat|)/;
print $m;

将第一个捕获复制到$m。模式中的括号()表示匹配字符串的哪些部分要捕获并存储到内置变量$1$2等。您可以拥有任意数量的捕获,并且它们可以编号与编号

中出现的左括号的编号相同

perlrequick所说的是成功匹配的内容。通常你会写

my $t = "housecats";
my $success = $t =~ m/house(cat|)/;
print $success ? "matched\n" : "no match\n";

此代码生成

matched

正如文件所述。如果将$t设置为housemartin,则结果相同,因为正则表达式模式成功找到house。但如果$thosepipe,则我们会看到no match,因为该字符串既不包含house也不包含housecat

如果需要提取匹配字符串的部分内容,则必须使用上述捕获。您可以通过访问内置变量$&来访问匹配的整个字符串,但这样做会导致除最新的Perl版本之外的所有版本都出现无法接受的性能下降。对于向后兼容性,您应该通过编写

捕获整个模式
my $t = "housecats";
my ($m) = $t =~ m/(house(cat|))/;
print $m;

按预期生成housecat。它还将$1$2的值分别设置为housecatcat

答案 2 :(得分:0)

my $t = "housecats";
my ($m) = $t=~m/house(cat|)/gn;
print $m;