Grep没有返回预期值Perl

时间:2014-06-06 15:43:13

标签: arrays perl

我试图在Perl中grep一个值:

@array = ['hello', 'world'];

if (grep(/hello/i, @array) {
   # do something
} 

出于某种原因,我的代码并没有捡起来。也许还有另一种方法可以做到这一点。

数组本身位于散列内:

hash => {
    array => ['hello', 'world'],
    value => 'feature',
}

4 个答案:

答案 0 :(得分:4)

您正在构建错误的阵列。该行创建一个单元素数组,该元素是数组引用。

@array = ['hello', 'world'];

当你对那个单元素数组进行grep时,那个数组引用不匹配/hello/i

你想要的是:

@array = ('hello', 'world');

答案 1 :(得分:3)

之后

@array = ['hello', 'world'];
你有:

$ perl -MData::Dumper -e '@array = ['hello', 'world']; print Dumper \@array'
$VAR1 = [
          [
            'hello',
            'world'
          ]
        ];

@array包含对包含字符串'hello''world'的匿名数组的引用。

然后,在grep中,您将此引用评估为字符串。因此,您的grep会按照

进行单一比较
'ARRAY(0x7fa0e38032b8)' =~ /hello/i;

显然,这是不匹配的。

#!/usr/bin/env perl

use strict;
use warnings;

my %hash = (array => ['hello', 'world']);

if (grep /hello/i, @{ $hash{array} }) {
   print "\@array contains 'hello'\n";
}

答案 2 :(得分:1)

用法确实是

if (grep(/hello/i, @array)) { ... }

但根据评论,你没有命名数组。您有一个数组的引用。因此,您使用数组取消引用替换@array

if (grep(/hello/i, @$array_ref)) { ... }

的缩写
if (grep(/hello/i, @{ $array_ref })) { ... }

由于您的引用来自哈希,您也可以

if (grep(/hello/i, @{ $hash{$key} })) { ... }

答案 3 :(得分:0)

  

数组本身位于哈希:

hash => {
    array => ['hello', 'world'],
    value => 'feature',
}

使用Data::Dumper查看您对结构的确切定义:

use Data::Dumper;
use feature qw(say);   # Highly recommend "say" when using Data::Dumper!


my %hash = (
    array => ['hello', 'world'],
    value => 'feature',
);

...
say Dumper \%hash;

看看打印出来的是什么。 (注意前面的反斜杠,所以你传入一个reference_而不是值列表)。

你会看到的是这样的:

$ var = {       'array'=> [              '你好',              '世界',            ]     }

array不仅仅是一个数组,它是对数组的引用。您需要取消引用才能使其正常工作:

if ( grep {/hello/i } @{ $hash->{array} } )

或者...

my @array = @{ $hash->{array} );
if ( grep { /hello/i } @array;