我正在尝试使用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";
Run Code Online (Sandbox Code Playgroud)
输出:
$VAR1 = 'TOMMY';
$VAR2 = 0;
$VAR3 = 'WILL';
$VAR4 = 0;
2
Run Code Online (Sandbox Code Playgroud)
正如观察到的那样,我在使用map时没有正确获取值,但在后面的命令中使用它时可以正常使用.我打算用$ _作为@arr的元素.这可能是不正确的.那么,请建议我一个替代方案.我必须使用foreach吗?
这个问题就在这里:
List::MoreUtils::firstidx{/$_/} @udData1
Run Code Online (Sandbox Code Playgroud)
在这段代码,你希望$_既取自模式@arr,并从所采取的字符串@udData1 在同一时间.(请记住,这firstidx{/TOMMY/}意味着firstidx{$_ =~ /TOMMY/},同样firstidx{/$_/}意味着firstidx{$_ =~ /$_/}.)
实际发生的是$_来自@udData1(因为那是最里面的循环)的值,然后你最终匹配它自己.因为它是一个简单的字母字符串,它总是匹配自己,并且firstidx正确返回0.
这是使用临时词法变量的一种解决方案:
my %output = map{ my $p = $_;
$p => List::MoreUtils::firstidx{/$p/} @udData1 } @arr;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
797 次 |
| 最近记录: |