我一直在测试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'
有什么问题?有什么不妥吗?
答案 0 :(得分:1)
你可能误解了评论。这意味着
for my $t (qw( housecats house )) {
my ($m) = $t =~ /house(cat|)/;
print "[$m]\n";
}
将打印
[cat]
[]
即。正则表达式将匹配housecat
和house
。如果模式完全不匹配,则$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
。但如果$t
为hosepipe
,则我们会看到no match
,因为该字符串既不包含house
也不包含housecat
如果需要提取匹配字符串的部分内容,则必须使用上述捕获。您可以通过访问内置变量$&
来访问匹配的整个字符串,但这样做会导致除最新的Perl版本之外的所有版本都出现无法接受的性能下降。对于向后兼容性,您应该通过编写
my $t = "housecats";
my ($m) = $t =~ m/(house(cat|))/;
print $m;
按预期生成housecat
。它还将$1
和$2
的值分别设置为housecat
和cat
答案 2 :(得分:0)
my $t = "housecats";
my ($m) = $t=~m/house(cat|)/gn;
print $m;