在Perl中,如何检查数组是否与其内容中至少列出一次的值相匹配?

daj*_*oto 1 arrays perl match

我之前从未真正使用过Perl(尽可能避免使用它),所以我对这个主题的知识很少.

我知道我正在查看的脚本在@ :: s_Ship_sShipProducts中有一个ProductID值数组.

我试图看看数组中的任何ProductID是以B还是S开头并执行一个函数,否则执行另一个函数.但我最终得到的是每个ProductID做声明.这就是我(诚然被打捞)所拥有的.

my $i;
for $i (0 .. $#::s_Ship_sShipProducts) # for each product
    if  ($::s_Ship_sShipProducts[$i] =~ /^(B|S)/) # Determine if B or S product
        {
        if (defined $phashBandDefinition->{'FreeOver'} && CalculatePrice() > 250)
        {$nCost = 0;}
        }
    else    {
        if (defined $phashBandDefinition->{'FreeOver'} && CalculatePrice() > $phashBandDefinition->{'FreeOver'})
        {$nCost = 0;}
        }
Run Code Online (Sandbox Code Playgroud)

我怎么能改变这个以便检查数组以查看是否有任何ProductID为真并返回true,如果没有匹配则返回false?然后根据true或false执行相应的函数?我做了一些阅读,但仍然在黑暗中.谢谢你的时间.

DVK*_*DVK 6

如果数组不是太大(或者您不太关心性能),您可以通过grep以下方式检查是否存在任何匹配值:

if (my @matching_elements = grep { /^(B|S)/ } @::s_Ship_sShipProducts) {
   # Better yet use /^[BS]/ expression - more idiomatic/readable
   print "Found B/S\n";
} else {
   print "NOT Found B/S\n";
}
Run Code Online (Sandbox Code Playgroud)

完成后,@matching_elements将包含匹配ID列表.

罕见的情况下,当数组太大而无法完全扫描并且您只需要找到第一次出现时,您可以使用Perl中的数组中的二进制搜索中讨论的任何数组搜索优化策略


顺便说一句,你的搜索方法非常好,你只需要在找到后退出循环 - 并启动,这是上面列表中显示的那些优化方法之一:

for my $i (0 .. $#::s_Ship_sShipProducts) # for each product
    if  ($::s_Ship_sShipProducts[$i] =~ /^[BS]/) {  # Determine if B or S product
        # Execute your logic here
        last; # Found, get out of the loop.
    } 
}
Run Code Online (Sandbox Code Playgroud)

注意:在Perl 5.10及更高版本中,您可以 - 而不是grep- 使用所谓的"智能匹配"运算符~~:

if (@::s_Ship_sShipProducts ~~ /^(B|S)/) {
    # Your logic
}
Run Code Online (Sandbox Code Playgroud)