perl三元语句与print有奇怪的结果

时间:2014-10-15 20:06:46

标签: perl printing ternary fizzbuzz

我一直在搞乱在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语句会做什么会导致这种情况发生?

3 个答案:

答案 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

最笨重的解决方案