Grep在Perl数组中查找项目

时间:2011-10-26 03:39:11

标签: perl grep

每当我输入内容时,代码总是告诉我它存在。但我知道有些输入不存在。有什么问题?

#!/usr/bin/perl

@array = <>;
print "Enter the word you what to match\n";
chomp($match = <STDIN>);

if (grep($match, @array)) {
    print "found it\n";
}

6 个答案:

答案 0 :(得分:29)

您给grep的第一个arg需要评估为true或false以指示是否存在匹配。所以它应该是:

# note that grep returns a list, so $matched needs to be in brackets to get the 
# actual value, otherwise $matched will just contain the number of matches
if (my ($matched) = grep $_ eq $match, @array) {
    print "found it: $matched\n";
}

如果您需要匹配很多不同的值,那么考虑将array数据放入hash也可能值得考虑,因为哈希允许您有效地执行此操作而无需迭代列表。

# convert array to a hash with the array elements as the hash keys and the values are simply 1
my %hash = map {$_ => 1} @array;

# check if the hash contains $match
if (defined $hash{$match}) {
    print "found it\n";
}

答案 1 :(得分:25)

您似乎正在使用grep(),就像Unix grep实用程序一样,这是错误的。

标量上下文中的Perl grep()计算列表中每个元素的表达式,并返回表达式为真的次数。 因此,当$match包含任何“true”值时,标量上下文中的grep($match, @array)将始终返回@array中的元素数。

相反,请尝试使用模式匹配运算符:

if (grep /$match/, @array) {
    print "found it\n";
}

答案 2 :(得分:2)

除了eugene和stevenl发布的内容之外,您可能会遇到在一个脚本中同时使用<><STDIN>的问题:<>遍历(=连接)作为命令提供的所有文件行参数。

但是,如果用户忘记在命令行中指定文件,它将从STDIN读取,并且您的代码将在输入时永远等待

答案 3 :(得分:2)

可以使用List::Utilfirst函数

来完成
use List::Util qw/first/;

my @array = qw/foo bar baz/;
print first { $_ eq 'bar' } @array;

来自List::Util的其他功能,例如maxminsum也可能对您有用

答案 4 :(得分:1)

如果你的数组包含字符串“hello”,我可能会发生这种情况,如果你正在搜索“he”,grep会返回true,尽管“he”可能不是数组元素。

也许,

if (grep(/^$match$/, @array))更贴切。

答案 5 :(得分:1)

您还可以检查多个数组中的单个值,例如

if (grep /$match/, @array, @array_one, @array_two, @array_Three)
{
    print "found it\n";
}