Instr等价于perl?

时间:2012-05-25 07:28:01

标签: regex perl hash

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

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

@SplitNames =(“naag algates”,“arvind singh”,“abhay avasti”,“luv singh”,“new algates”)现在我想要阻止所有有“唱歌”,“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 个答案:

答案 0 :(得分:6)

你应该修改这一行:

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

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

^从头开始寻找匹配。

有关perl元字符的更多详细信息,请参阅here

修改: 如果您需要基于姓氏进行阻止,请在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";
}

答案 1 :(得分:5)

不要尝试处理一串限制名称,处理数组。

然后只使用the smart match operator~~或两个波浪号字符)来查看是否包含给定字符串。

#!/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;

答案 2 :(得分: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";
   }
}

答案 3 :(得分:0)

最常用的方法是创建受限制名称的哈希值,然后从名称中拆分姓氏,并检查姓氏是否在哈希值中。

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。但是,将' '与split一起使用是一种特殊情况。它在任何长度的空格上分裂,并且也忽略任何前导空格,因此它对于分割单个单词的字符串很有用。

仅供参考,相当于perl中的instr是使用index($string, $substring)。如果$substring内未发生$string,则会返回-1。任何其他值表示$string包含$substring。然而,当比较列表时,使用像我上面所示的哈希要轻松得多......而且与索引不同,它不会匹配“快乐”。当你真的只是为了匹配“快乐”时。