Perl发现X是否是数组中的元素

时间:2016-10-21 20:22:13

标签: perl grep

我不知道为什么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";
            }
     }

输出:它总是进入其他条件并返回“它不存在!” :(

任何想法。我完成了任何愚蠢的错误吗?

1 个答案:

答案 0 :(得分:2)

您正在使用匿名数组 [ ... ],然后将其作为标量(引用)分配给@techarray,作为其唯一元素。它就像@arr = 'a';。数组由( ... )定义。

解决方法是定义数组my @techarray = ( ... ),或者正确定义arrayref,然后在搜索时取消引用

my $rtecharray = [ .... ];
if (grep {$_ eq $search_id} @$rtecharray) {
    # ....
}

对于所有类型的列表操作,请查看List::UtilList::MoreUtils

更新了问题中的更改,因为已添加子

这还有别的东西,更有启发性。

将数组传递给函数时,它将作为元素的平面列表传递。然后在函数中,第一个shift获取第一个元素, 然后第二个shift选择第二个'json.jquery..'

然后搜索在数组上,只有'php.linux.'元素,用于check_val(\@techarray, $search_id); 字符串。

相反,您可以传递参考,

my (@array, $search_id) = @_;  # WRONG

并在函数中使用它。

注意如果您传递数组并在函数中获取参数

@_

您实际上@array全部纳入{{1}}

例如,参见this post(传递给函数)和this post(从函数返回)。

一般情况下,我建议通过引用传递列表。