每当我输入内容时,代码总是告诉我它存在。但我知道有些输入不存在。有什么问题?
#!/usr/bin/perl
@array = <>;
print "Enter the word you what to match\n";
chomp($match = <STDIN>);
if (grep($match, @array)) {
print "found it\n";
}
答案 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::Util的first
函数
use List::Util qw/first/;
my @array = qw/foo bar baz/;
print first { $_ eq 'bar' } @array;
来自List::Util
的其他功能,例如max
,min
,sum
也可能对您有用
答案 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";
}