使用List :: MoreUtils :: firstidx的问题

时间:2012-06-01 06:13:22

标签: perl

我正在尝试使用List :: MoreUtils方法。但是,在某些情况下需要清楚它的用法。

如果可以与地图一起使用,请告诉我。例如:

#!/usr/bin/perl

use strict;
use warnings;
use List::Util;
use List::MoreUtils;
use Data::Dumper;


my @udData1 = qw(WILL SMITH TOMMY LEE JONES);

my @arr = qw(WILL TOMMY);
my %output = map{$_=>List::MoreUtils::firstidx{/$_/} @udData1} @arr;
print Dumper %output;
print List::MoreUtils::firstidx{/TOMMY/} @udData1;
print "\n";

输出:

$VAR1 = 'TOMMY';
$VAR2 = 0;
$VAR3 = 'WILL';
$VAR4 = 0;
2

正如观察到的那样,我在使用map时没有正确获取值,但在后面的命令中使用它时可以正常使用。 我打算用$ _作为@arr的元素。这可能是不正确的。那么,请建议我一个替代方案。我必须使用foreach吗?

1 个答案:

答案 0 :(得分:5)

这个问题就在这里:

List::MoreUtils::firstidx{/$_/} @udData1

在这段代码中,您希望$_同时是@arr采用的模式和同时从@udData1 获取的字符串。 (请注意,firstidx{/TOMMY/}表示firstidx{$_ =~ /TOMMY/},同样firstidx{/$_/}表示firstidx{$_ =~ /$_/}。)

实际发生的是$_是来自@udData1的值(因为那是最里面的循环),你最终将它与自身匹配。因为它是一个简单的字母字符串,所以它总是匹配自己,而firstidx正确地返回0。

这是一个使用临时词法变量的解决方案:

my %output = map{ my $p = $_;
                  $p => List::MoreUtils::firstidx{/$p/} @udData1 } @arr;