我一直在搞乱在perl中编写FizzBuzz ...具体而言我想做一个噩梦看代码行只是为了看看我是否可以做到。这当然意味着嵌套的三元语句!
然而,我发现在15年代它从未打印过FizzBuzz,只是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语句会做什么会导致这种情况发生?
答案 0 :(得分:2)
这是一个短路评估的例子,如perlop中所述。在a() && b()
的情况下,如果b()
为false,则永远不会评估a()
。在你的(深层嵌套和令人困惑的)三元语句中,这相当于同样的事情。为了解决这个问题,我将声明分成多行。
答案 1 :(得分: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
答案 2 :(得分: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
最笨重的解决方案