3

perl 中的一个新任务(我以前从未使用过)。所以请帮助我,即使这听起来很傻。

一个名为 RestrictedNames 的变量包含受限制的用户名列表。SplitNames 是一个数组变量,其中包含完整的用户名集。现在我必须检查是否在 RestrictedNames 变量中找到当前名称,例如使用 instr。

@SplitNames = ("naag algates","arvind singh","abhay avasti","luv singh","new algates") 现在我想阻止所有具有“singh”、“algates”等的姓氏。

@SplitNames = ("naag algates","arvind singh","abhay avasti","luv singh","new algates")
$RestrictedNames="tiwary singh algates n2 n3 n4 n5 n6";
for(my $i=0;$i<@SplitNames;$i++)
{
    if($RestrictedNames =~ m/^$SplitNames[$i]/ ) //google'd this condition, still fails
    {
          print "$SplitNames[$i] is a restricted person";
    }
}

我恳请您帮助我找到解决方案。如果已经问过这个问题,请原谅我并分享该链接。

4

4 回答 4

6

您应该修改这一行:

if($RestrictedNames =~ m/^$SplitNames[$i]/ )

if($RestrictedNames =~ m/$SplitNames[$i]/ )

^从头开始寻找匹配。

有关 perl 元字符的更多详细信息,请参见此处

编辑: 如果您需要基于姓氏的阻塞,请在 for-loop 正文中尝试此代码。

my @tokens = split(' ', $SplitNames[$i]); # splits name on basis of spaces
my $surname = $tokens[$#tokens]; # takes the last token
if($RestrictedNames =~ m/$surname/ )
{
      print "$SplitNames[$i] is a restricted person\n";
}
于 2012-05-25T07:35:34.667 回答
5

不要尝试处理一串受限制的名称,而是处理一个数组。

然后只需使用智能匹配运算符~~或两个波浪号)来查看给定的字符串是否在其中。

#!/usr/bin/perl
use v5.12;
use strict;
use warnings;

my $RestrictedNames="n1 n2 n3 n4 n5 n6 n7 n8 n9";
my @restricted_names = split " ", $RestrictedNames;
say "You can't have foo" if 'foo' ~~ @restricted_names;
say "You can't have bar" if 'bar' ~~ @restricted_names;
say "You can't have n1" if 'n1' ~~ @restricted_names;
say "You can't have n1a" if 'n1a' ~~ @restricted_names;
于 2012-05-25T07:37:03.027 回答
3

使用 Hash Slice 尝试以下操作:

my @users =  ( "n10", "n12", "n13", "n4", "n5" );
my @r_users = ( "n1", "n2", "n3", "n4", "n5", "n6", "n7", "n8", "n9" ) ;
my %check;
@check{@r_users}  = ();
foreach my $user ( @users ) {
   if ( exists $check{$user} ) {
      print"Restricted User: $user  \n";
   }
}
于 2012-05-25T07:49:17.970 回答
1

最惯用的方法是创建受限制名称的散列,然后将姓氏从名称中分离出来并检查姓氏是否在散列中。

use strict;
use warnings;

my @SplitNames = ("naag algates","arvind singh","abhay avasti","luv singh","new algates");
my $RestrictedNames = "tiwar y singh algates n2 n3 n4 n5 n6";

# Create hash of restricted names
my %restricted;
map { $restricted{$_}++ } split ' ', $RestrictedNames;

# Loop over names and check if surname is in the hash
for my $name (@SplitNames) {
    my $surname = (split ' ', $name)[-1];
    if ( $restricted{$surname} ) {
        print "$name is a restricted person\n";
    }
}

请注意,该split函数通常采用 RegEx。但是使用' 'with split 是一种特殊情况。它分割任意长度的空格,并且忽略任何前导空格,因此对于分割单个单词的字符串很有用。

仅供参考,instrperl 中的等价物是使用index($string, $substring). 如果$substring里面没有发生$string就会返回-1。任何其他值均$string包含$substring. 但是,在比较列表时,使用上面显示的哈希会少很多麻烦......而且与索引不同,当您真的只想匹配“joy”时,它不会匹配“joyce”。

于 2016-01-12T22:06:47.727 回答