2012-06-01 40 views
3

我想使用List :: MoreUtils方法。但是,在某些情況下需要對其使用情況進行一些明確。問題使用List :: MoreUtils :: firstidx

請讓我知道,如果它可以與地圖一起使用。例如:

#!/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 

如所觀察到使用地圖時,我不能正確得到的值,但在以後的命令一起使用時得到它的罰款。 我打算使用$ _作爲@arr的一個元素。這可能是不正確的。所以,請給我一個替代方案。我必須使用foreach嗎?

回答

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;