Perl   发布时间:2022-04-07  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了匹配字符串数组以在perl中搜索的最简单方法?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我想要做的是检查我的搜索字符串的字符串数组并获取相应的键,以便我可以存储它.使用Perl是否有一种神奇的方法,或者我注定要使用循环?如果是这样,最有效的方法是什么?

我对Perl比较陌生(我只编写了2个其他脚本),所以我还不知道很多魔法,只是Perl是魔术= D

Reference Array: (1 = 'Canon',2 = 'HP',3 = 'Sony')
Search String: Sony's Cyber-shot DSC-S600
End Result: 3

解决方法

更新:

根据您在this question中讨论的结果,根据您对“不使用循环”构成的意图/标准,下面的基于地图的解决方案(请参阅“选项#1”)可能是最简洁的解决方案,前提是您没有虑映射一个循环(答案的简短版本是:它是一个循环,就实现/性能而言,它不是语言理论观点的循环).

假设你不关心你是否得到“3”或“索尼”作为答案,你可以在一个简单的情况下通过从数组中用“或”逻辑(|)构建一个正则表达式来完成它,就像这个:

@H_380_4@my @Strings = ("Canon","HP","Sony"); my $search_in = "Sony's Cyber-shot DSC-S600"; my $combined_search = join("|",@Strings); my @which_found = ($search_in =~ /($combined_search)/); print "$which_found[0]\n";

我的测试结果:索尼

正则表达式(一旦变量$combined_search被Perl插值)采取形式/(Canon | HP | Sony)/这就是你想要的.

如果任何字符串包含正则表达式特殊字符(例如|或)),这将无法正常工作 – 在这种情况下,您需要转义它们

注意:我个人认为这有点作弊,因为为了实现join(),Perl本身必须在interPeter内的某个地方做一个循环.因此,这个答案可能无法满足您保持无循环的愿望,这取决于您是否希望避免出现性能虑的循环,以及更清晰或更短的代码.

附:要获得“3”而不是“索尼”,你将不得不使用一个循环 – 或者以明显的方式,通过在它下面的循环中进行1次匹配;或者使用一个库来节省你自己编写循环但会在调用下面有一个循环.

我将提供3种替代解决方案.

#1选项: – 我最喜欢的.使用“地图”,我个人仍然认为这是一个循环:

@H_380_4@my @Strings = ("Canon",@Strings); my @which_found = ($search_in =~ /($combined_search)/); print "$which_found[0]\n"; die "Not found" unless @which_found; my $Strings_index = 0; my %Strings_indexes = map {$_ => $Strings_index++} @Strings; my $index = 1 + $Strings_indexes{ $which_found[0] }; # Need to add 1 since arrays in Perl are zero-index-started and you want "3"

#2选项:使用隐藏在一个很好的CPAN库方法后面的循环:

use List::MoreUtils qw(firstidX);
my @Strings = ("Canon",@Strings); 
my @which_found = ($search_in =~ /($combined_search)/); 
die "Not Found!"; unless @which_found;
print "$which_found[0]\n";
my $index_of_found = 1 + firstidx { $_ eq $which_found[0] } @Strings; 
# Need to add 1 since arrays in Perl are zero-index-started and you want "3"

#3选项:这是明显的循环方式:

@H_380_4@my $found_index = -1; my @Strings = ("Canon","Sony"); my $search_in = "Sony's Cyber-shot DSC-S600"; foreach my $index (0..$#Strings) { next if $search_in !~ /$Strings[$index]/; $found_index = $index; last; # quit the loop early,which is why I didn't use "map" here } # check $found_index against -1; and if you want "3" instead of "2" add 1.

大佬总结

以上是大佬教程为你收集整理的匹配字符串数组以在perl中搜索的最简单方法?全部内容,希望文章能够帮你解决匹配字符串数组以在perl中搜索的最简单方法?所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。