什么是Perl相当于Python的枚举?

Fli*_*imm 7 python perl

我正在寻找Perl 5中的一个函数,它与Python的enumerate内置函数类似.它将返回一个对数组的引用列表,其中每个数组是[$index, $element]:

@a = ("a", "b", "c");
@b = enumerate @a;
# @b = ([0, "a"], [1, "b"], [2, "c"])
Run Code Online (Sandbox Code Playgroud)

List :: UtilList :: MoreUtils似乎没有这个功能.还有其他模块吗?

Bor*_*din 10

你可以map像这样使用

my @data = qw / a b c /;
my @enumeration = map [ $_, $data[$_] ], 0 .. $#data;
Run Code Online (Sandbox Code Playgroud)

  • 我不知道`map`可以接受一个没有花括号的块. (3认同)
  • @Flimm:它将需要一个 *block* 或一个 *expression*。看一看[文档](http://perldoc.perl.org/functions/map.html)。只有当你需要编写多个语句时(例如常见的`map { chomp; $ _ } <$fh>`) 或消除呼叫歧义。在实践中,它可以帮助使您的代码可读。在这里,我省略了大括号,因为表达式已经有方括号来分隔它。 (2认同)

Thi*_*Not 8

enumerate 返回一个迭代器,而不是一个列表,所以你应该真的要求一个迭代器.


在Perl 5.12.0及更高版本中,您可以使用each迭代数组:

use strict;
use warnings 'all';
use 5.012;

my @a = qw(foo bar baz);

while (my ($i, $v) = each @a) {
    say "$i -> $v";
}

__END__
0 -> foo
1 -> bar
2 -> baz
Run Code Online (Sandbox Code Playgroud)

但是,使用时应该非常小心each; 有些人甚至完全不鼓励使用它.


Mic*_*man 7

Perl没有这样做的内置功能,但它很容易推出自己的功能.

使用map:

my @a = qw(a b c);
my $i = 0;
my @b = map [$i++, $_], @a; # ([0, 'a'], [1, 'b'], [2, 'c'])
Run Code Online (Sandbox Code Playgroud)

从v5.20开始,Perl的新切片语法做了类似的事情:

my @a = qw(a b c);
my @b = %a[0..$#a]; # (0, 'a', 1, 'b', 2, 'c')
Run Code Online (Sandbox Code Playgroud)

该切片语法返回索引/值对列表,但它是一个平面列表.这些对不会分组为嵌套数组.如果这对您的应用程序很重要,您可以使用List :: Util中的pairmap函数来执行此操作:

use List::Util qw(pairmap);
my @a = qw(a b c);
my @b = pairmap {[$a, $b]} %a[0..$#a]; # ([0, 'a'], [1, 'b'], [2, 'c'])
Run Code Online (Sandbox Code Playgroud)