如何使用值数组来限制perl中的for循环?

时间:2013-04-24 03:32:56

标签: arrays perl for-loop

我知道这个问题相当模糊,但我希望解释的空间可以帮助解决问题,这是我整天都在捣乱我的大脑,并且通过搜索找不到任何建议。

基本上我有一个数组@cluster,我正在尝试使用迭代器$ x跳过位于该数组中的值。这个数组的大小会有所不同,所以我不能只是(相当恶劣地)使if语句不幸地适用于所有情况。

通常当我需要用标量值执行此操作时,我只会这样做:

for my $x (0 .. $numLines){
    if($x != $value){
        ...
    }
}

有什么建议吗?

3 个答案:

答案 0 :(得分:7)

你可以这样做:

my @cluster = (1,3,4,7);
outer: for my $x (0 .. 10){
    $x eq $_ and next outer for @cluster;
    print $x, "\n";
}

使用Perl 5.10,你也可以这样做:

for my $x (0 .. 10){
    next if $x ~~ @cluster;
    print $x, "\n";
}

或者更好地使用哈希:

my @cluster = (1,3,4,7);
my %cluster = map {$_, 1} @cluster;
for my $x (0 .. 10){
    next if $cluster{$x};
    print $x, "\n";
}

答案 1 :(得分:2)

嗯......如果您要跳过线路,为什么不直接使用该标准而不记住需要过滤的线路?

grep函数是用于过滤列表的强大构造:

my @array = 1 .. 10;

print "$_\n" for grep { not /^[1347]$/ } @array;  # 2,5,6,8,9,10
print "$_\n" for grep {     $_ % 2     } @array;  # 1,3,5,7,9

my @text = qw( the cat sat on the mat );

print "$_\n" for grep { ! /at/ } @text;           # the, on, the

更少杂乱,更多DWIM!

答案 2 :(得分:1)

你的意思是这样的:

for my $x (0 .. $numLines){
    my $is_not_in_claster = 1;
    for( @claster ){
         if( $x == $_ ){
             $is_not_in_claster = 0;
             last;
         }
    }
    if( $is_not_in_claster ){
        ...
    }
}