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";
}
}
我恳请您帮我解决问题。如果已经提出要求,请原谅我并分享该链接。
答案 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
。然而,当比较列表时,使用像我上面所示的哈希要轻松得多......而且与索引不同,它不会匹配“快乐”。当你真的只是为了匹配“快乐”时。