Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Perl中自动获取foreach循环中的循环索引_Perl_Foreach - Fatal编程技术网

在Perl中自动获取foreach循环中的循环索引

在Perl中自动获取foreach循环中的循环索引,perl,foreach,Perl,Foreach,如果我有以下Perl数组: @x = qw(a b c); 我用foreach对其进行迭代,然后$\uuz将引用数组中的当前元素: foreach (@x) { print; } 将打印: abc 有没有类似的方法可以在不手动更新计数器的情况下获取当前元素的索引?例如: foreach (@x) { print $index; } 其中,$索引像$一样更新,以产生输出: 012 perldoc perlvar似乎不建议任何此类变量。不适用于foreach 如果确实需要数

如果我有以下Perl数组:

@x = qw(a b c);
我用
foreach
对其进行迭代,然后
$\uuz
将引用数组中的当前元素:

foreach (@x) {
    print;
}
将打印:

abc
有没有类似的方法可以在不手动更新计数器的情况下获取当前元素的索引?例如:

foreach (@x) {
    print $index;
}
其中,
$索引
$一样更新,以产生输出:

012

perldoc perlvar
似乎不建议任何此类变量。

不适用于
foreach

如果确实需要数组中的元素基数,请使用“for”迭代器:

for ($i=0; $i<@x; ++$i) {
  print "Element at index $i is " , $x[$i] , "\n";
}
对于($i=0;$i类似,您必须迭代数组索引,而不是其元素。与C样式的
for
循环相比,我更喜欢此变体:

用于我的$i(0..$#x){
打印“$i:$x[$i]\n”;
}

不,您必须自己制作计数器。还有一个例子:

my $index;
foreach (@x) {
    print $index++;
}
当用于索引时

my $index;
foreach (@x) {
    print $x[$index]+$y[$index];
    $index++;
}

当然,您可以使用
local$index;
来代替
my$index;
等等。

好的,有这样一种方法:

use List::Rubyish;

$list = List::Rubyish->new( [ qw<a b c> ] );
$list->each_index( sub { say "\$_=$_" } );
使用列表::rubysh;

$list=list::rubysh->new([qw.

在5.10之前的Perl中,您可以说

#!/usr/bin/perl

use strict;
use warnings;

my @a = qw/a b c d e/;

my $index;
for my $elem (@a) {
    print "At index ", $index++, ", I saw $elem\n";
}

#or

for my $index (0 .. $#a) {
    print "At index $index I saw $a[$elem]\n";
}
#!/usr/bin/perl

use 5.012; # This enables strict
use warnings;

my @a = qw/a b c d e/;

while (my ($index, $elem) = each @a) {
    say "At index $index I saw $elem";
}
在Perl 5.10中,您可以使用声明一个永远不会重新初始化的变量(与使用创建的变量不同)。这允许您将
$index
变量保持在较小的范围内,但它可能会导致错误(如果您第二次进入循环,它仍将具有最后一个值):

在Perl 5.12中,您可以说

#!/usr/bin/perl

use strict;
use warnings;

my @a = qw/a b c d e/;

my $index;
for my $elem (@a) {
    print "At index ", $index++, ", I saw $elem\n";
}

#or

for my $index (0 .. $#a) {
    print "At index $index I saw $a[$elem]\n";
}
#!/usr/bin/perl

use 5.012; # This enables strict
use warnings;

my @a = qw/a b c d e/;

while (my ($index, $elem) = each @a) {
    say "At index $index I saw $elem";
}
但是要注意:当使用
每个
进行迭代时,您可以使用
@a
执行的操作是有限的

现在它对您没有帮助,但是在Perl 6中,您可以说

#!/usr/bin/perl6

my @a = <a b c d e>;
for @a Z 0 .. Inf -> $elem, $index {
    say "at index $index, I saw $elem"
}
!/usr/bin/perl6

my@a=包含从0到无穷大(至少理论上)的每个整数的列表。
->$elem,$index
表示我们一次从zip的结果中获取两个值。其余的对您来说应该是正常的(除非您还不熟悉5.10中的函数).

在大多数情况下,您不需要知道索引。您可以这样做:

my @arr = (1, 2, 3);
foreach (@arr) {
    $_++;
}
print join(", ", @arr);
在这种情况下,输出将是2,3,4,因为foreach为实际元素设置了别名,而不仅仅是副本。

提供了一种方便的
方法:

use autobox::Core;

['a'..'z']->for( sub{
    my ($index, $value) = @_;
    say "$index => $value";
});
或者,看看迭代器模块,例如:

另见:

    • 我试过

      @array = qw /tomato banana papaya potato/;             # Example array
      my $count;                                             # Local variable initial value will be 0.
      print "\nBefore For loop value of counter is $count";  # Just printing value before entering the loop.
      
      for (@array) { print "\n",$count++," $_" ; }           # String and variable seperated by comma to
                                                             # execute the value and print.
      undef $count;                                          # Undefining so that later parts again it will
                                                             # be reset to 0.
      
      print "\nAfter for loop value of counter is $count";   # Checking the counter value after for loop.
      
      简言之

      @array = qw /a b c d/;
      my $count;
      for (@array) { print "\n",$count++," $_"; }
      undef $count;
      

      是的。我查阅了很多书和其他博客……结论是,循环计数器没有任何系统变量。我们必须制作自己的计数器。如果我错了,请纠正我。

      可以使用
      循环(
      foreach
      不支持此功能):

      输出:

      Index: 0, Element: 1111
      Index: 1, Element: 2222
      Index: 2, Element: 3333
      
      Perl版本:5.14.4请考虑:

      print "Element at index $_ is $x[$_]\n" for keys @x;
      
      哦,是的,您可以!(有点,但您不应该)。
      标量上下文中的每个(@array)
      都会为您提供数组的当前索引

      @a = (a..z);
      for (@a) { 
        print each(@a) . "\t" . $_ . "\n"; 
      }
      
      这里,
      each(@a)
      在一个标量上下文中,只返回索引,而不返回该索引处的值。由于我们在
      for
      循环中,我们已经有了$中的值。相同的机制经常在每个循环中使用。同样的问题

      如果您再次对(@a)
      执行
      ,问题就会出现。索引不会像您预期的那样返回到0;它是
      undef
      ,然后是0,1,2…一次计数。
      each()
      的perldoc表示要避免此问题。使用
      for
      循环跟踪索引

      基本上:

      for(my $i=0; $i<=$#a; $i++) {
        print "The Element at $i is $a[$i]\n";
      }
      

      不需要0+;如果递增的变量未定义,则postincrement返回0。@ysth:当应用程序中的某个地方有人使用与您相同的全局$index变量时,您可能会感到惊讶。但是如果您编写简短脚本,并且假设……不,不要这样做。这个答案可以说比
      for的
      循环语法更可读(my$index;$index foreach和for是可互换的同义词。一些介绍性材料试图使用for来表示C风格循环和foreach for列表迭代器循环,但这一术语的使用并不是每个人都熟悉的。foreach和for是/不/可互换的,如本例所示。引用'perldoc perlvar':“foreach”关键字实际上是“for”关键字的同义词,因此您可以使用“foreach”来表示可读性,也可以使用“for”来表示简洁。endquote。因此它们是可互换的。试试看。关键字是可互换的,但循环本身有不同的含义。“for”循环是一个递增(或递减)的循环变量,即使它是用foreach关键字引入的。“foreach”循环有一个内部迭代器,即使它是用for关键字引入的。“OP”想要访问迭代器,所以他想要一个“for”循环,而不管使用的关键字是什么。C风格的for循环(你们都一直在调用“for循环”)不必递增/递减变量,例如:for(my$iter=new_iter();$iter;$iter=$iter->next()){…}如果将第一行替换为:my@arr=('foo','bar','foo'),会发生什么;它将打印1,1,1,因为字符串标量在数字上下文中使用时计算为零。我知道在大多数情况下我不需要索引。问题是当我确实需要索引时获取它的最佳方式。我不喜欢关于
      状态的部分
      ,我认为使用
      {my$index;…}会更好
      。我会用@Brad Gilbert:Changed格式的链接替换发行版的链接。不过我个人更喜欢顶级(主页)我同意,有时指向Dist视图而不是perldoc视图是有用的。仅仅因为我将替换链接,并不一定意味着您应该这样做。@Brad Gilbert:这可能是perl中TIMTOWTDI的一个很好的示例?:)无论如何,这没有问题,如果perldoc链接在互联网上越来越流行,那么我很乐意改用它。这当然不违背
      for(my $i=0; $i<=$#a; $i++) {
        print "The Element at $i is $a[$i]\n";
      }
      
      my $index=0;
      for (@a) {
        print "The Element at $index is $a[$index]\n";
        $index++;
      }