我不知道为什么Perl中的小东西对我不起作用。我对此感到抱歉。
我在2小时左右尝试过,但我无法得到结果。
my $technologies = 'json.jquery..,php.linux.';
my @techarray = split(',',$technologies);
#my @techarray = [
# 'json.jquery..',
# 'php.linux.'
# ];
my $search_id = 'json.jquery..';
check_val(@techarray, $search_id);
我正在做一个“if”来搜索数组中的上述项目。但它不适合我。
sub check_val{
my @techarray = shift;
my $search_id = shift;
if (grep {$_ eq $search_id} @techarray) {
print "It is there \n";
}else{
print "It is not there \n";
}
}
输出:它总是进入其他条件并返回“它不存在!” :(
任何想法。我完成了任何愚蠢的错误吗?
答案 0 :(得分:2)
您正在使用匿名数组 [ ... ]
,然后将其作为标量(引用)分配给@techarray
,作为其唯一元素。它就像@arr = 'a';
。数组由( ... )
定义。
解决方法是定义数组my @techarray = ( ... )
,或者正确定义arrayref,然后在搜索时取消引用
my $rtecharray = [ .... ];
if (grep {$_ eq $search_id} @$rtecharray) {
# ....
}
对于所有类型的列表操作,请查看List::Util和List::MoreUtils。
更新了问题中的更改,因为已添加子
这还有别的东西,更有启发性。
将数组传递给函数时,它将作为元素的平面列表传递。然后在函数中,第一个shift
获取第一个元素,
然后第二个shift
选择第二个'json.jquery..'
。
然后搜索在数组上,只有'php.linux.'
元素,用于check_val(\@techarray, $search_id);
字符串。
相反,您可以传递参考,
my (@array, $search_id) = @_; # WRONG
并在函数中使用它。
注意如果您传递数组并在函数中获取参数
@_
您实际上将@array
全部纳入{{1}} 。
例如,参见this post(传递给函数)和this post(从函数返回)。
一般情况下,我建议通过引用传递列表。