如何使用perl从第一次出现具有特定值的元素循环数组?

lex*_*ope 4 arrays perl loops perl5

我有一个像阵列("值a","VALUEB","valueC","价值")等.我要循环的数组的值从(例如)"valueC"的第一个实例开始.应该忽略值"valueC"的第一个实例之前的数组中的所有内容; 所以在这种情况下,循环只处理"valueC"和"valueD".

我可以在我的循环中放置一个条件,但是有一种更简洁的方式来表达使用perl的想法吗?

cho*_*oba 6

my $seen;
for ( grep $seen ||= ($_ eq "valueC"), @array ) {
    ...
}
Run Code Online (Sandbox Code Playgroud)

  • `$ seen`变量用作标志:我已经看过起始值吗?`grep`迭代数组,如果还没有看到,它会将比较结果分配给看到.这样,在值C的第一次出现时看到将被设置为1,并且稍后不会改变.Grep将仅返回`$ array`为'$ seen`为真的那些值,即1. (2认同)

Zai*_*aid 6

my $seen;
for ( @array ) {

    $seen++ if /valueC/;
    next unless $seen;
    ...
}
Run Code Online (Sandbox Code Playgroud)

但这$seen有点笨拙.该触发器操作看起来更整洁IMO:

for ( @array ) {

    next unless /^valueC$/ .. /\0/;
           # or /^valueC$/ .. '' !~ /^$;
           # or $_ eq 'valueC' .. /\0/;
    ...
}
Run Code Online (Sandbox Code Playgroud)

或者简单地说(建立在ikegami的建议上):

for ( grep { /^valueC$/ .. /(*FAIL)/ } @array ) { ... }
Run Code Online (Sandbox Code Playgroud)


jch*_*s12 6

我想你还需要检查数组中是否存在"valueC".
希望这可以帮助.

use strict;
use warnings;
use List::Util qw(first);

my @array = qw(valueA valueB valueC valueD);

my $starting_element = 'valueC';

# make sure that the starting element exist inside the array
# first search for the first occurrence of the $stating_element
# dies if not found
my $starting_index = first { $array[$_] eq $starting_element } 0 .. $#array
    or die "element \"$starting_element\" does not exist inside the array";

# your loop
for my $index ($starting_index .. $#array) {
    print $array[$index]."\n";
}
Run Code Online (Sandbox Code Playgroud)