perl中的子字符串匹配,是或否

时间:2017-11-18 14:31:58

标签: perl

使用perl,我想在字符串中找到一个子字符串。结果是真/假,然后我将决定该怎么做。帖子here很好,但对我来说用法含糊不清。

my $big_string = "Hello Good World";
my $pat = "world";

虽然大写/非大写字母并不重要,但我希望得到真实。

use List::Util 'any';
my $match_found = any { /$pat/ } @big_string;
if (match_found)
   print "yes\n";
else
   print "no\n";

这是对的吗?有没有更好的API用于此目的?

1 个答案:

答案 0 :(得分:3)

这是不正确的,因为它甚至没有编译:{{1​​}} / if后面总是跟着Perl中的else {块。此外,}缺少变量上的if (match_found)符号。

如果您确实需要不区分大小写的匹配(即忽略大写和小写字母之间的差异),则需要将$标志添加到正则表达式。

最后,您的代码未定义i数组,只定义@big_string标量。

所以:

$big_string

此代码可以使用,但可以改进。

首先,为什么要使用use strict; use warnings; use List::Util 'any'; my $big_string = "Hello Good World"; my $pat = "world"; my $match_found = any { /$pat/i } $big_string; if ($match_found) { print "yes\n"; } else { print "no\n"; } ?我们没有要检查的多个字符串列表:

any

其次,my $match_found = $big_string =~ /$pat/i; 看起来不像是一个正则表达式。这是一个简单的字符串。这对字母数字字符(例如$pat)没有任何影响,但通常我们应该在不打算被解释为正则表达式的字符串中转义所有正则表达式元字符。这可以使用world函数(或其quotemeta \Q简短形式)来完成:

\E

这是我们的改进版本:

my $match_found = $big_string =~ /\Q$pat\E/i;

最后,我们甚至不需要正则表达式进行简单的子字符串搜索。相反,我们可以这样做:

use strict;
use warnings;

my $big_string = "Hello Good World";
my $pat = "world";

my $match_found = $big_string =~ /\Q$pat\E/i;
if ($match_found) {
   print "yes\n";
} else {
   print "no\n";
}

fc实现完整的Unicode案例折叠。