在 Perl 中,如何检查数组是否与在其内容中至少列出一次的值匹配?
我以前从未真正使用过 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;}
}
我如何更改此设置,以便检查数组以查看是否有任何 ProductID 为 true 并返回 true,如果没有匹配则返回 false?然后根据true或false执行相应的函数?我读了一些书,但仍然一无所知。感谢您抽出时间。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
如果数组不是太大(或者你不太关心性能),你可以通过
grep
检查是否有任何匹配的值:完成后,
@matching_elements
将包含匹配 ID 的列表。在罕见情况下,当数组太大而无法完全扫描而您只需要查找第一次出现时,您可以使用Perl 数组中的二进制搜索
顺便说一句,你的方法搜索工作完全正常,您只需要在找到后退出循环 - 并且启动,是上面列表中显示的优化方法之一:
注意:在 Perl 5.10 及更高版本中,您可以 - 而不是
grep
- 使用所谓的“智能匹配”运算符~~
:If the array is not too big (or you don't care THAT much about performance), you can check if there are any matching values via
grep
:When done,
@matching_elements
would contain a list of matching IDs.In the rare case when the array IS too big to scan through entirely and you only need to find the first occurance, you can use any of the array search optimization strategies discussed in binary search in an array in Perl
By the way, your approach to search works perfectly fine, you merely need to quit the loop once you found - and to boot, is one of those optimized approaches shown in the list above:
NOTE: In Perl 5.10 and above, you can - instead of
grep
- use a so-called "smart match" operator~~
:我不太确定我是否在关注您的问题,但我认为您正在寻找 grep< /a>.
I'm not quite sure if I'm following your question, but I think you are looking for grep.