3

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

4

1 回答 1

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;
于 2012-06-01T06:21:19.510 回答