1

我一直在用 perl 编写 FizzBu​​zz……具体来说,我想做一个看起来像噩梦的代码行,看看我能不能做到。这当然意味着嵌套的三元语句!

但是我发现在 15 年代它从不打印 FizzBu​​zz,只是 Fizz。我找不到原因,因为这意味着如果第一个三元语句返回 true,它只是跳过了第二个语句。

这是我想出的小噩梦。是的,它可能会更糟,但我对 perl 真的没有那么强,这只是对我自己的练习:

#!/usr/bin/perl

for (my $i=1; $i<=100; $i++) {
      ( !( ($i % 3 == 0) ? print "Fizz" : 0) && !( ($i % 5 == 0) ? print "Buzz" : 0) ) ? print "$i\n" : print "\n";
}

这是前 20 行输出:

1
2
Fizz
4
Buzz
Fizz
7
8
Fizz
Buzz
11
Fizz
13
14
Fizz
16
17
Fizz
19
Buzz

print 语句会做什么会导致这种情况发生?

4

3 回答 3

2

这是一个短路评估的示例,如perlop中所述。在 的情况下a() && b(),如果为假,b()则永远不会被评估。a()在您的(深度嵌套且令人困惑的)三元语句中,这相当于同一件事。为了解决这个问题,我将语句分成多行。

于 2014-10-15T20:18:59.947 回答
1

简化:

for my $i ( 1 .. 20 ) {
    print +( ( $i % 3 ? '' : 'Fizz' ) . ( $i % 5 ? '' : 'Buzz' ) ) || $i, "\n";
}

输出:

1
2
Fizz
4
Buzz
Fizz
7
8
Fizz
Buzz
11
Fizz
13
14
FizzBuzz
16
17
Fizz
19
Buzz
于 2014-10-15T22:05:47.203 回答
0

实际上,我们开始吧,位移可以节省时间

#!/usr/bin/perl

for (my $i=1; $i<=100; $i++) {
      (((($i % 3 == 0) ? print "Fizz" : 0) + ( ($i % 5 == 0) ? print "Buzz" : 0)) << 1) ? print "\n" : print "$i\n";
}

输出:

1
2
Fizz
4
Buzz
Fizz
7
8
Fizz
Buzz
11
Fizz
13
14
FizzBuzz
16
17
Fizz
19
Buzz

最klugey解决方案

于 2014-10-15T20:37:36.317 回答