【问题标题】:Best way to alternate a variable value in loop? (Perl)在循环中交替变量值的最佳方法? (Perl)
【发布时间】:2014-02-08 08:01:28
【问题描述】:
my @arr = (1,2,3,4,5,6,7,8,9);

my $counter = 0;
foreach my $a (@arr) {
    my $str;
    if ($counter % 2 == 0) {
        $str = 'hi';
    } else {
        $str = 'bye';
    }
    print $str . "\n";
    $counter++;
}

对于 while 循环的每次迭代,在两个不同值之间交替的最佳方法是什么?上面的简单例子,有没有比保持计数器和修改找到偶数更好的方法?

【问题讨论】:

  • 可能有几十种不同的方法来做你所描述的事情。定义“更好”/“最好”。最少的代码行?最易读?最快?
  • 也许是$toggle = ! $toggle;(您目前在此处递增计数器),但它的代码并没有减少或更容易理解。
  • 我猜“最佳”可能是最少的代码行数。我宁愿不必使用计数器,但我不知道 Perl 是否有特殊的方法可以实现这一点。
  • 最糟糕的方法? stackoverflow.com/questions/4959230

标签: perl loops


【解决方案1】:
my @arr = qw( a b c );

for my $i (0..$#arr) {
    print "$arr[$i] ", $i % 2 ? 'bye' : 'hi', "\n";
}

【讨论】:

  • 你也可以使用二元运算符:$i & 1
【解决方案2】:

好名字。

my /*boolean*/ $even = 0;
foreach ...

    next if ... # skipping line

    $even = !$even;

    ... # work
    print $even ? 'hi' : 'bye';

【讨论】:

    【解决方案3】:

    我会这样做:

    ...
    my @arr = (1..9);
    
    for (my $i=0; $i<scalar(@arr); $i++) {
      my $str = ($i % 2 == 0) ? 'hi' : 'bye';
      print "$str\n";
    }
    

    【讨论】:

      【解决方案4】:
      my ($foo, $bar) = qw(foo bar);
      for (0..10) {
        print "$foo\n";
        ($foo, $bar) = ($bar, $foo);
      }
      

      【讨论】:

        【解决方案5】:

        一个奇怪的,但没有计数器,也没有修改以找到偶数

        use strict;
        
        sub foo {
            shift || return and bar(@_);
            print "doing something with Value2 \n";
        }
        
        sub bar {
            shift || return and foo(@_);
            print "doing something with Value1 \n";
        }
        
        
        foo(1..100);
        

        通过调用foo()bar() 并选择100 的偶数或奇数来做任何你想做的事情。也许你想使用$#arr insted 硬编码值等等。

        但是请不要这样写代码。

        【讨论】:

          【解决方案6】:

          无法抗拒:

          my @arr = (1,2,3,4,5,6,7,8,9);
          my @alt = qw( hi bye );
          
          my $counter = 0;
          foreach my $a (@arr) {
              print $alt[($counter++ % 2)] . "\n";
          }
          

          或者根据 dolmen 的评论使用“&”,与模 (%) 相比应该更有效

          my @arr = (1,2,3,4,5,6,7,8,9);
          my @alt = qw( hi bye );
          
          my $counter = 0;
          foreach my $a (@arr) {
              print $alt[($counter++ & 1)] . "\n";
          }
          

          【讨论】:

            猜你喜欢
            • 2016-11-29
            • 1970-01-01
            • 1970-01-01
            • 2011-02-25
            • 2019-10-08
            • 1970-01-01
            • 2014-02-16
            • 2015-03-22
            • 1970-01-01
            相关资源
            最近更新 更多