我之前从未真正使用过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执行相应的函数?我做了一些阅读,但仍然在黑暗中.谢谢你的时间.
如果数组不是太大(或者您不太关心性能),您可以通过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)