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

観察されたように、マップを使用すると値が正しく取得されませんが、後のコマンドで使用すると正常に取得されます。@arr の要素として $_ を使用するつもりです。これは正しくない可能性があります。だから、私に代替案を提案してください。foreachを使用する必要がありますか?

4

1 に答える 1

5

問題は、ここにあるこのビットです。

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

このコードでは、$_から取得したパターンと から@arr取得した文字列の両方を@udData1 同時に取得することを想定しています。firstidx{/TOMMY/}(それは を意味firstidx{$_ =~ /TOMMY/}し、同様にをfirstidx{/$_/}意味することを思い出してくださいfirstidx{$_ =~ /$_/}。)

実際に起こるのは、 (最も内側のループであるため) から$_の値であり、@udData1それ自体と照合することになります。これは単純なアルファベット文字列であるため、常にそれ自体と一致し、firstidx は正しく 0 を返します。

一時的な字句変数を使用した 1 つの解決策を次に示します。

my %output = map{ my $p = $_;
                  $p => List::MoreUtils::firstidx{/$p/} @udData1 } @arr;
于 2012-06-01T06:21:19.510 に答える