String perl仅将整个单词与数组列表匹配

String perl仅将整个单词与数组列表匹配,string,perl,match,String,Perl,Match,我需要能够将一个用户与一个用户列表进行匹配,但只能是精确匹配。 在下面的示例代码中: -如果strUser包含信息,则存在匹配项,这很好。 -如果strUser包含信息,或者infostuff,则存在一个匹配项,这是不好的。 我无法使用\b修饰符,因为变量将只包含用户名,没有空格或单词边界 #!/usr/bin/perl $strUser = "theinfo"; $strUsers = "(alpha|info|omega)"; if ( $strUser =~ /$strUsers/ ) {

我需要能够将一个用户与一个用户列表进行匹配,但只能是精确匹配。 在下面的示例代码中: -如果strUser包含信息,则存在匹配项,这很好。 -如果strUser包含信息,或者infostuff,则存在一个匹配项,这是不好的。 我无法使用\b修饰符,因为变量将只包含用户名,没有空格或单词边界

#!/usr/bin/perl
$strUser = "theinfo";
$strUsers = "(alpha|info|omega)";
if ( $strUser =~ /$strUsers/ ) {
 print "match\n";
}
exit(0);

在regex^和\z中使用边界:

注意,由于您可能希望使用文字字符串,因此我将更加努力地使用quotemeta构建正则表达式:

但是,一个更简单的解决方案是使用散列,因为您正在寻找精确匹配:

my @users = qw(alpha info omega);

my %is_user = map { $_ => 1 } @users;

if ( $is_user{$strUser} ) {
    print "match\n";
}

最后,在每个perl脚本中始终包含和。

谢谢。。。那起作用了。。。早些时候,我尝试在$strUsers中使用\b,我应该在if语句中使用它。时间到时将接受回答。@Xi Vix,\b也在$struser中工作。您可能忘了逃出\。始终严格使用;使用警告;。啊,泰@ikegami。我没想过。将在我的改进中包括这一点。^\z在我看来有点不协调……显然这只是一个风格问题,但配对\a\z或^$match更适合我的眼睛。@Ashley,这是公平的。我个人可能会使用^$,但这取决于OP的数据是否可能包含行尾。我打赌它不会,但宁愿给出技术上正确的答案,也不愿下注。由于琐碎而关闭。OP使用\b而不是\\b来创建一个由\b组成的字符串,这是一个在“使用警告”下很明显的问题;由于答案的有用性而撤回。不严格使用;使用警告;就像在黑暗中驾驶你的汽车而不打开车头灯和安全带:你撞车和死亡的可能性并没有降低,你只是在事故发生之前没有意识到这一点。
#!/usr/bin/perl
use strict;
use warnings;

my $strUser = "theinfo";

my @users = qw(alpha info omega);

my $list_users_re = join '|', map {quotemeta} @users;

if ( $strUser =~ /^($list_users_re)\z/ ) {
    print "match\n";
}

exit(0);
my @users = qw(alpha info omega);

my %is_user = map { $_ => 1 } @users;

if ( $is_user{$strUser} ) {
    print "match\n";
}