我正在尝试使用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吗?
答案 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;