伪代码如下所示:
foreach $term (@array1) {
if ($term is found in @array2) {
#do something here
}
}
我已经掌握了"foreach"和"do something here"的部分......但是所有我尝试的用于"if term is found in array"测试的方法都不起作用......
我曾尝试使用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"。
这个练习只是为了从一个充满垃圾的文件中找到一些重要信息而设计的一个快速脏脚本,所以我选择跳过所有的好处(使用严格、警告、模块、子程序)...这不必优雅,只要简单即可。
我正在搜索的术语存储在通过split实例化的变量中:
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中,它也对所有$term2的值成功匹配…array1是一个几千行的文件。我在这里调用的元素$term2是一个离散的术语,可能出现在多行中,但在任何给定的行中都不会重复(或成为更大字符串的一部分)。Array2大约有几十个元素,我需要将其“过滤”以获得输出。
...
我刚刚尝试了以下建议:
if (grep $_ eq $term2, @array2)
对于所有的$term2值,这个grep都失败了......我从grep中得到的是全有或全无的响应......所以我想我需要停止使用grep。尝试其中一种哈希解决方案......但我真的需要更多关于它们的解释和说明。
$term
的价值是什么?请提供有关您搜索术语的示例以及您期望匹配和不匹配的内容。您是否寻找精确匹配(“foo”仅匹配“foo”)或部分匹配(“foo”匹配“food”)? - mob@array =\
cat $file`可能被认为是一个无用的
cat用法。Perl 有一个非常好(更好)的
open` 命令可以使用。 - TLP