【问题标题】:How do I use an array of values to limit a for loop in perl?如何使用值数组来限制 perl 中的 for 循环?
【发布时间】:2013-04-17 11:12:57
【问题描述】:

我知道这个问题相当模糊,但我希望解释的空间可以帮助阐明,这是我整天绞尽脑汁但无法通过搜索找到任何建议的问题。

基本上我有一个数组@cluster,我试图用它来使迭代器 $x 跳过位于该数组中的值。数组的大小会有所不同,所以不幸的是,我不能(相当残忍地)做出 if 语句来适应所有情况。

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

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

有什么建议吗?

【问题讨论】:

  • 你的意思是像for my $x(@cluster)这样的吗?
  • 恰恰相反。我希望不使用 @cluster 中的任何值。我想我可以在当前的 for $x 循环中使用另一个 for 循环,例如 for my $y(@cluster)
  • 您如何知道要跳过的值?是它等于一个特定的值还是处理了n值?
  • 它等于位于@cluster 中的任何值。

标签: arrays perl for-loop


【解决方案1】:

你可以这样做:

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";
}

【讨论】:

  • 谢谢,我暗暗希望我有一个使用哈希的借口,我已经很久没有使用哈希了。非常感谢!
  • 写 Perl 而不使用哈希很奇怪 :)
  • 不幸的是,我是一个 Perl 初学者,但哈希类型对我来说非常有趣,我一直在尝试将它放在我所做的一切中,但目前我的工作相当简单。跨度>
  • @SirLulzalot 作为初学者,你怎么能在很长的时间里没有理由?
  • 考虑到我在 Perl XD 中的生活
【解决方案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!

【讨论】:

  • 嗯,我实际上并没有使用 Perl 的 grep 函数实现任何东西,这是我在 bash 中的全部研究,但在这里我从未想过。我会考虑它以供将来尝试,谢谢!
【解决方案3】:

你的意思是这样的吗:

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 ){
        ...
    }
}

?

【讨论】:

  • 是的,这可以完成工作,我希望 perl 有一些更优雅的东西,但这是一个相当复杂的逻辑语句,谢谢!
  • 请注意,此解决方案必须为每个 $x 循环遍历 @claster,这将使其随着 $numLines@claster 的增长呈指数级增长。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-11-01
  • 2013-04-25
  • 1970-01-01
  • 2021-04-02
  • 2020-02-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多