gpt4 book ai didi

perl - 匹配字符串数组以在 perl 中搜索的最简单方法?

转载 作者:行者123 更新时间:2023-12-04 10:21:49 24 4
gpt4 key购买 nike

我想要做的是根据我的搜索字符串检查字符串数组并获取相应的键,以便我可以存储它。 Perl 是否有一种神奇的方法可以做到这一点,还是我注定要使用循环?如果是这样,最有效的方法是什么?

我对 Perl 比较陌生(我只写了另外两个脚本),所以我还不知道很多魔法,只是 Perl 是魔法 =D

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

最佳答案

更新:

基于 this question 中的讨论结果,取决于您对构成“不使用循环”的意图/标准,map下面的基于解决方案(请参阅“ 选项 #1 )可能是最简洁的解决方案,前提是您不考虑 map 循环(答案的简短版本是:就循环而言,这是一个循环)实现/性能,从语言理论的角度来看,这不是循环)。

假设您不在乎答案是“3”还是“Sony” ,在简单的情况下,您可以通过使用“或”逻辑( | )从数组构建正则表达式来完成此操作,如下所示:

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";

我的测试运行结果: Sony
正则表达式将(一旦变量 $combined_search 被 Perl 插值)采用 /(Canon|HP|Sony)/ 的形式这就是你想要的。

如果任何字符串包含正则表达式特殊字符(例如 |) ),这将无法按原样工作 - 在这种情况下,您需要对它们进行转义

注意 : 我个人认为这有点作弊,因为为了执行 join() , Perl 本身必须在 interpeter 内部的某个地方做一个循环。因此,这个答案可能无法满足您保持无循环的愿望,这取决于您是否出于性能考虑而想要避免循环,或者拥有更清晰或更短的代码。

附言要获得“3”而不是“Sony”,您将必须使用循环 - 以一种明显的方式,通过在它下面的循环中进行 1 个匹配;或者使用一个库来避免你自己编写循环,但在调用下面会有一个循环。

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

#1 选项: - 我最喜欢的。使用“ map ”,我个人仍然认为这是一个循环:
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";
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", "HP", "Sony");
my $search_in = "Sony's Cyber-shot DSC-S600";
my $combined_search = join("|",@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 选项:这是明显的循环方式:
my $found_index = -1;
my @strings = ("Canon", "HP", "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 中搜索的最简单方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3019708/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com