我正在遍历一个数组,我想测试是否在另一个数组中找到了一个元素。
在伪代码中,我想做的是:
foreach $term (@array1) {
if ($term is found in @array2) {
#do something here
}
}
我已经得到了“foreach”和“在这里做点什么”部分向下拍......但是我为“如果在数组中找到术语”测试所做的一切都不起作用......
我试过grep:
if grep {/$term/} @array2 { #do something }
# this test always succeeds for values of $term that ARE NOT in @array2
if (grep(/$term/, @array2)) { #do something }
# this test likewise succeeds for values NOT IN the array
我已经尝试了几种不同风格的“将数组转换为哈希”,许多以前的帖子都表明它们是如此简单和容易……但它们都没有奏效。
我是 perl 的长期低级用户,我只了解 perl 的基础知识,不了解包含我在互联网上阅读的 99% 解决方案的所有花哨的混淆代码......我真的,真的,老实说,感谢代码中明确的任何答案,并提供代码在做什么的分步解释......
...我真的不了解 $_ 和任何其他类型或类型的隐藏、理解或隐含的值、变量或函数。如果任何示例或示例的所有变量和函数都以明确的术语命名($term 而不是 $_),我将非常感激......可能希望有一天能够理解它。请。:-)
...
我有一个现有的脚本,它成功地使用了“grep”:
$rc=grep(/$term/, @array);
if ($rc eq 0) { #something happens here }
但是我将完全相同的代码应用到我的新脚本中,但它根本没有正确成功......即,当它测试我知道数组中不存在的 $term 值时它“成功”(rc = 零)测试。我只是不明白。
'旧'脚本和'新'脚本之间的'grep'方法的唯一区别是我如何构建数组......在旧脚本中,我通过从文件中读取来构建数组:
@array=`cat file`;
而在新脚本中,我将数组放在脚本本身中(因为它很小)......像这样:
@array=("element1","element2","element3","element4");
这怎么会导致 grep 函数的不同输出?它们都是沼泽标准阵列!我不明白!!!!:-(
################################################# ######################附录...我的实际代码的一些说明或示例:
################################################# ######################我试图匹配/查找/grep 的术语是一个单词元素,例如“word123”。
这个练习只是为了成为一个快速n-dirty脚本,从一个充满垃圾的文件中找到一些重要信息,所以我选择跳过所有细节(使用严格、警告、模块、子例程)......这不是不必优雅,只要简单。
我正在搜索的术语存储在一个通过拆分实例化的变量中:
foreach $line(@array1) {
chomp($line); # habit
# every line has multiple elements that I want to capture
($term1,$term2,$term3,$term4)=split(/\t/,$line);
# if a particular one of those terms is found in my other array 'array2'
if (grep(/$term2/, @array2) {
# then I'm storing a different element from the line into a 3rd array which eventually will be outputted
push(@known, $term1) unless $seen{$term1}++;
}
}
看到那里的 grep 了吗?它工作不正确......它对 $term2 的所有值都成功,即使它绝对不在 array2 中...... array1 是一个几千行的文件。我在这里调用 $term2 的元素是一个离散项,它可能位于多行中,但在任何给定行中都不会重复(或较大字符串的一部分)。Array2 大约有几十个元素,我需要为我的输出“过滤”。
...
我刚刚尝试了以下建议之一:
if (grep $_ eq $term2, @array2)
对于 $term2 的所有值,这个 grep 都失败了……我从 grep 得到一个全有或全无的响应……所以我想我需要停止使用 grep。尝试其中一种哈希解决方案......但我真的可以使用更多的解释和澄清。