我试图在Perl中grep一个值:
@array = ['hello', 'world'];
if (grep(/hello/i, @array) {
# do something
}
出于某种原因,我的代码并没有捡起来。也许还有另一种方法可以做到这一点。
数组本身位于散列内:
hash => {
array => ['hello', 'world'],
value => 'feature',
}
答案 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;