PERL for循环中$的下一个元素是什么

PERL for循环中$的下一个元素是什么,perl,Perl,我想比较循环的两个连续元素 @arr=qw(1 2 3 3 4); foreach(@arr) { if($_ == $_+1) { print "yes"; } } 在这种情况下,我应该使用什么来代替$uu1呢?我会用简单的老式C方式: for( my $i=0; $i<@arr-1; $i++ ){ if( $arr[$i] == $arr[$i+1] ){ print "yes\n"; } } 我会用简单的老C方式: for( my $i=0;

我想比较循环的两个连续元素

@arr=qw(1 2 3 3 4);
foreach(@arr)
{
if($_ == $_+1)
  {
  print "yes";
  }
}

在这种情况下,我应该使用什么来代替$uu1呢?

我会用简单的老式C方式:

for( my $i=0; $i<@arr-1; $i++ ){
   if( $arr[$i] == $arr[$i+1] ){
      print "yes\n";
   }
}

我会用简单的老C方式:

for( my $i=0; $i<@arr-1; $i++ ){
   if( $arr[$i] == $arr[$i+1] ){
      print "yes\n";
   }
}

你必须循环索引

my @arr = qw(1 2 3 3 4);
foreach (0 .. $#arr-1) {
  my ($current, $next) = @arr[$_, $_+1];

  if ($current == $next) {
    print "yes";
  }
}

你必须循环索引

my @arr = qw(1 2 3 3 4);
foreach (0 .. $#arr-1) {
  my ($current, $next) = @arr[$_, $_+1];

  if ($current == $next) {
    print "yes";
  }
}

FP解决方案将使用
List::MoreUtils
中的
pairwise

pairwise {
    say "yes" if $a == $b;
} @arr @{[ @arr[1..$#arr] ]}
@{[…]}
很烦人,但是
成对
需要一个真正的数组,而数组片段不需要(您不能引用它们))


(注意:
$b
在数组的最后一次迭代中将是未定义的,这可能是您想要的)。

FP解决方案将使用
成对的
来自
列表::MoreUtils

pairwise {
    say "yes" if $a == $b;
} @arr @{[ @arr[1..$#arr] ]}
@{[…]}
很烦人,但是
成对
需要一个真正的数组,而数组片段不需要(您不能引用它们))


(注意:
$b
在数组的最后一次迭代中将是未定义的,这可能是您想要的)。

是的,可以使用基于范围的
foreach
循环执行此操作,而无需处理索引。但是,你没有向前看,而是跟踪你去过的地方;在上一次迭代中得到的数字。并避免在第一次迭代时打印

{
  my $prev;
  foreach ( @arr ) {
    print "yes ($prev==$_)\n" if defined $prev && $prev == $_;
    $prev = $_;
  }
}
这假设
@arr
中没有“undef”元素。如果可能的话,使用不同的哨兵来检测第一次迭代,或者只是在索引上迭代,如其他答案所示

如果循环使用
next
,您可能希望将每次迭代结束时绝对必须发生的事情放入
continue{…}
块中

{
  my $prev;
  foreach ( @arr ) {
    next unless defined $prev && $prev == $_;
    print "yes ($prev==$_)\n";
  }
  continue {
    $prev = $_;
  }
}
外部块不是严格必要的;它只是用来约束我们的临时
$prev
变量的范围


请记住,在Perl中,仅仅访问数组中的元素可能会产生副作用(多亏了绑定变量的魔力)。因此,(从语言设计的角度来看,
foreach
提供“peek_next”功能不一定是个好主意。

是的,可以通过基于范围的
foreach
循环来实现,而不必处理索引。但是,你没有向前看,而是跟踪你去过的地方;在上一次迭代中得到的数字。并避免在第一次迭代时打印

{
  my $prev;
  foreach ( @arr ) {
    print "yes ($prev==$_)\n" if defined $prev && $prev == $_;
    $prev = $_;
  }
}
这假设
@arr
中没有“undef”元素。如果可能的话,使用不同的哨兵来检测第一次迭代,或者只是在索引上迭代,如其他答案所示

如果循环使用
next
,您可能希望将每次迭代结束时绝对必须发生的事情放入
continue{…}
块中

{
  my $prev;
  foreach ( @arr ) {
    next unless defined $prev && $prev == $_;
    print "yes ($prev==$_)\n";
  }
  continue {
    $prev = $_;
  }
}
外部块不是严格必要的;它只是用来约束我们的临时
$prev
变量的范围


请记住,在Perl中,仅仅访问数组中的元素可能会产生副作用(多亏了绑定变量的魔力)。因此,
foreach
提供“peek_next”功能(从语言设计的角度来看)不一定是个好主意。

我知道,有没有办法使用foreachI知道这一点,有没有办法使用foreach只要有办法获得下一个值,当我们到达最后4个值时会发生什么?它将与未定义的值进行比较,如果有办法获得下一个值,条件将失败,当我们到达最后4个值时会发生什么?它将与未定义的值进行比较,条件将失败