为什么Perl的转变抱怨'转移的类型1必须是数组(不是grep iterator).'?

wes*_*wes 10 syntax perl grep

我有一个数据结构,它是一个包含哈希数组的哈希.我想到达那里并拿出与我正在寻找的值相匹配的第一个哈希值.我试过这个:

   my $result = shift grep {$_->{name} eq 'foo'} @{$hash_ref->{list}};
Run Code Online (Sandbox Code Playgroud)

但是,这给了我这个错误:Type of arg 1 to shift must be array (not grep iterator). 我重读的perldocgrep,我觉得我在做什么是有意义的. grep返回一个列表,对吗?它是在错误的背景下吗?

我现在将使用一个临时变量,但我想弄清楚为什么这不起作用.

Que*_*tin 18

列表不是数组.

my ($result) = grep {$_->{name} eq 'foo'} @{$hash_ref->{list}};
Run Code Online (Sandbox Code Playgroud)

......应该做好这份工作.从列表上下文中的grep返回,但不要分配除第一个之外的任何值.

  • 我想我会在白板上写100次"列表不是数组".谢谢. (5认同)

Leo*_*ans 17

我认为更好的方法是写这个:

use List::Util qw/first/;

my $result = first { $_->{name} eq 'foo' } @{ $hash_ref->{list} };
Run Code Online (Sandbox Code Playgroud)

不仅会更清楚你要做什么,它也会更快,因为一旦找到匹配的元素,它将停止grepping你的数组.