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个值时会发生什么?它将与未定义的值进行比较,条件将失败